mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-11-04 01:37:32 +03:00 
			
		
		
		
	chore: export hydrate from standalone build
This commit is contained in:
		
							parent
							
								
									8757fa510a
								
							
						
					
					
						commit
						0658b8ea67
					
				
							
								
								
									
										2
									
								
								custom.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								custom.d.ts
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -13,7 +13,7 @@ declare module '*.css' {
 | 
				
			||||||
  export default content;
 | 
					  export default content;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare var __DEV__: boolean;
 | 
					declare var __REDOC_DEV__: boolean;
 | 
				
			||||||
declare var __REDOC_VERSION__: string;
 | 
					declare var __REDOC_VERSION__: string;
 | 
				
			||||||
declare var __REDOC_REVISION__: string;
 | 
					declare var __REDOC_REVISION__: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ const server = http.createServer(async (request, response) => {
 | 
				
			||||||
    fs.createReadStream('bundles/redoc.standalone.js', 'utf8').pipe(response);
 | 
					    fs.createReadStream('bundles/redoc.standalone.js', 'utf8').pipe(response);
 | 
				
			||||||
  } else if (request.url === '/') {
 | 
					  } else if (request.url === '/') {
 | 
				
			||||||
    const spec = yaml.load(readFileSync(resolve(__dirname, '../openapi.yaml')));
 | 
					    const spec = yaml.load(readFileSync(resolve(__dirname, '../openapi.yaml')));
 | 
				
			||||||
    let store = await createStore(spec, '', { nativeScrollbars: true });
 | 
					    let store = await createStore(spec, 'path/to/spec.yaml');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const sheet = new ServerStyleSheet();
 | 
					    const sheet = new ServerStyleSheet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,26 +37,21 @@ const server = http.createServer(async (request, response) => {
 | 
				
			||||||
          margin: 0;
 | 
					          margin: 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      </style>
 | 
					      </style>
 | 
				
			||||||
      <script src="https://unpkg.com/react/umd/react.production.min.js"></script>
 | 
					 | 
				
			||||||
      <script src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
 | 
					 | 
				
			||||||
      <script src="redoc.standalone.js"></script>
 | 
					      <script src="redoc.standalone.js"></script>
 | 
				
			||||||
      <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
 | 
					      <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
 | 
				
			||||||
      ${css}
 | 
					      ${css}
 | 
				
			||||||
    </head>
 | 
					    </head>
 | 
				
			||||||
    <body>
 | 
					    <body>
 | 
				
			||||||
      <div id="redoc">${html}</div>
 | 
					 | 
				
			||||||
    <script>
 | 
					    <script>
 | 
				
			||||||
        const state = ${JSON.stringify(await store.toJS())};
 | 
					 | 
				
			||||||
        const store = Redoc.AppStore.fromJS(state);
 | 
					 | 
				
			||||||
        document.addEventListener('DOMContentLoaded', function() {
 | 
					        document.addEventListener('DOMContentLoaded', function() {
 | 
				
			||||||
          console.time('ReDoc hydrate');
 | 
					          const state = ${JSON.stringify(await store.toJS())};
 | 
				
			||||||
          ReactDOM.hydrate(React.createElement(Redoc.Redoc, {store: store}), document.getElementById('redoc'));
 | 
					          Redoc.hydrate(state, document.getElementById('redoc'));
 | 
				
			||||||
          console.timeEnd('ReDoc hydrate');
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        </script>
 | 
					        </script>
 | 
				
			||||||
 | 
					      <div id="redoc">${html}</div>
 | 
				
			||||||
    </body>
 | 
					    </body>
 | 
				
			||||||
    </html>`;
 | 
					    </html>`;
 | 
				
			||||||
    response.writeHead(200);
 | 
					    response.writeHead(200, { 'Content-Length': res.length });
 | 
				
			||||||
    response.write(res);
 | 
					    response.write(res);
 | 
				
			||||||
    response.end();
 | 
					    response.end();
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,13 +8,13 @@ import { resolve } from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('SSR', () => {
 | 
					describe('SSR', () => {
 | 
				
			||||||
  it('should render in SSR mode', async () => {
 | 
					  it('should render in SSR mode', async () => {
 | 
				
			||||||
    (global as any).__DEV__ = true;
 | 
					    (global as any).__REDOC_DEV__ = true;
 | 
				
			||||||
    const spec = yaml.load(readFileSync(resolve(__dirname, '../../demo/openapi.yaml')));
 | 
					    const spec = yaml.load(readFileSync(resolve(__dirname, '../../demo/openapi.yaml')));
 | 
				
			||||||
    const store = await createStore(spec, '');
 | 
					    const store = await createStore(spec, '');
 | 
				
			||||||
    expect(() => {
 | 
					    expect(() => {
 | 
				
			||||||
      renderToString(<Redoc store={store} />);
 | 
					      renderToString(<Redoc store={store} />);
 | 
				
			||||||
    }).not.toThrow();
 | 
					    }).not.toThrow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delete (global as any).__DEV__;
 | 
					    delete (global as any).__REDOC_DEV__;
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ import { RedocNormalizedOptions, RedocRawOptions } from './RedocNormalizedOption
 | 
				
			||||||
import { ScrollService } from './ScrollService';
 | 
					import { ScrollService } from './ScrollService';
 | 
				
			||||||
import { SearchStore } from './SearchStore';
 | 
					import { SearchStore } from './SearchStore';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface StoreData {
 | 
					export interface StoreState {
 | 
				
			||||||
  menu: {
 | 
					  menu: {
 | 
				
			||||||
    activeItemIdx: number;
 | 
					    activeItemIdx: number;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@ export class AppStore {
 | 
				
			||||||
   * **SUPER HACKY AND NOT OPTIMAL IMPLEMENTATION**
 | 
					   * **SUPER HACKY AND NOT OPTIMAL IMPLEMENTATION**
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  // TODO:
 | 
					  // TODO:
 | 
				
			||||||
  static fromJS(state: StoreData): AppStore {
 | 
					  static fromJS(state: StoreState): AppStore {
 | 
				
			||||||
    const inst = new AppStore(state.spec.data, state.spec.url, state.options, false);
 | 
					    const inst = new AppStore(state.spec.data, state.spec.url, state.options, false);
 | 
				
			||||||
    inst.menu.activeItemIdx = state.menu.activeItemIdx || 0;
 | 
					    inst.menu.activeItemIdx = state.menu.activeItemIdx || 0;
 | 
				
			||||||
    inst.menu.activate(inst.menu.flatItems[inst.menu.activeItemIdx]);
 | 
					    inst.menu.activate(inst.menu.flatItems[inst.menu.activeItemIdx]);
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@ export class AppStore {
 | 
				
			||||||
   * **SUPER HACKY AND NOT OPTIMAL IMPLEMENTATION**
 | 
					   * **SUPER HACKY AND NOT OPTIMAL IMPLEMENTATION**
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  // TODO:
 | 
					  // TODO:
 | 
				
			||||||
  async toJS(): Promise<StoreData> {
 | 
					  async toJS(): Promise<StoreState> {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      menu: {
 | 
					      menu: {
 | 
				
			||||||
        activeItemIdx: this.menu.activeItemIdx,
 | 
					        activeItemIdx: this.menu.activeItemIdx,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,7 +122,7 @@ export class OpenAPIParser {
 | 
				
			||||||
   * resets visited enpoints. should be run after
 | 
					   * resets visited enpoints. should be run after
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  resetVisited() {
 | 
					  resetVisited() {
 | 
				
			||||||
    if (__DEV__) {
 | 
					    if (__REDOC_DEV__) {
 | 
				
			||||||
      // check in dev mode
 | 
					      // check in dev mode
 | 
				
			||||||
      for (const k in this._refCounter._counter) {
 | 
					      for (const k in this._refCounter._counter) {
 | 
				
			||||||
        if (this._refCounter._counter[k] > 0) {
 | 
					        if (this._refCounter._counter[k] > 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,12 @@
 | 
				
			||||||
import * as React from 'react';
 | 
					import * as React from 'react';
 | 
				
			||||||
import { render } from 'react-dom';
 | 
					import { render, hydrate as hydrateComponent } from 'react-dom';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { RedocStandalone } from './components/RedocStandalone';
 | 
					import { RedocStandalone, Redoc } from './components/';
 | 
				
			||||||
 | 
					import { AppStore, StoreState } from './services/AppStore';
 | 
				
			||||||
import { querySelector } from './utils/dom';
 | 
					import { querySelector } from './utils/dom';
 | 
				
			||||||
 | 
					import { debugTime, debugTimeEnd } from './utils/debug';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { Redoc, AppStore } from './index';
 | 
					export { Redoc, AppStore } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const version = __REDOC_VERSION__;
 | 
					export const version = __REDOC_VERSION__;
 | 
				
			||||||
export const revision = __REDOC_REVISION__;
 | 
					export const revision = __REDOC_REVISION__;
 | 
				
			||||||
| 
						 | 
					@ -35,6 +37,7 @@ export function init(
 | 
				
			||||||
  specOrSpecUrl: string | any,
 | 
					  specOrSpecUrl: string | any,
 | 
				
			||||||
  options: any = {},
 | 
					  options: any = {},
 | 
				
			||||||
  element: Element | null = querySelector('redoc'),
 | 
					  element: Element | null = querySelector('redoc'),
 | 
				
			||||||
 | 
					  callback?: () => void,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
  if (element === null) {
 | 
					  if (element === null) {
 | 
				
			||||||
    throw new Error('"element" argument is not provided and <redoc> tag is not found on the page');
 | 
					    throw new Error('"element" argument is not provided and <redoc> tag is not found on the page');
 | 
				
			||||||
| 
						 | 
					@ -60,9 +63,24 @@ export function init(
 | 
				
			||||||
      ['Loading...'],
 | 
					      ['Loading...'],
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
    element,
 | 
					    element,
 | 
				
			||||||
 | 
					    callback,
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function hydrate(
 | 
				
			||||||
 | 
					  state: StoreState,
 | 
				
			||||||
 | 
					  element: Element | null = querySelector('redoc'),
 | 
				
			||||||
 | 
					  callback?: () => void,
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  debugTime('Redoc create store');
 | 
				
			||||||
 | 
					  const store = AppStore.fromJS(state);
 | 
				
			||||||
 | 
					  debugTimeEnd('Redoc create store');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  debugTime('Redoc hydrate');
 | 
				
			||||||
 | 
					  hydrateComponent(<Redoc store={store} />, element, callback);
 | 
				
			||||||
 | 
					  debugTimeEnd('Redoc hydrate');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * autoinit ReDoc if <redoc> tag is found on the page with "spec-url" attr
 | 
					 * autoinit ReDoc if <redoc> tag is found on the page with "spec-url" attr
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/utils/debug.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/utils/debug.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					export function debugTime(label: string) {
 | 
				
			||||||
 | 
					  if (__REDOC_DEV__) {
 | 
				
			||||||
 | 
					    console.time(label);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function debugTimeEnd(label: string) {
 | 
				
			||||||
 | 
					  if (__REDOC_DEV__) {
 | 
				
			||||||
 | 
					    console.timeEnd(label);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -7,3 +7,4 @@ export * from './highlight';
 | 
				
			||||||
export * from './loadAndBundleSpec';
 | 
					export * from './loadAndBundleSpec';
 | 
				
			||||||
export * from './dom';
 | 
					export * from './dom';
 | 
				
			||||||
export * from './decorators';
 | 
					export * from './decorators';
 | 
				
			||||||
 | 
					export * from './debug';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ export default env => {
 | 
				
			||||||
        'process.env.NODE_ENV': env.prod ? '"production"' : '"development"',
 | 
					        'process.env.NODE_ENV': env.prod ? '"production"' : '"development"',
 | 
				
			||||||
        __REDOC_VERSION__: VERSION,
 | 
					        __REDOC_VERSION__: VERSION,
 | 
				
			||||||
        __REDOC_REVISION__: REVISION,
 | 
					        __REDOC_REVISION__: REVISION,
 | 
				
			||||||
        __DEV__: env.prod ? 'false' : 'true',
 | 
					        __REDOC_DEV__: env.prod ? 'false' : 'true',
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
      new webpack.NamedModulesPlugin(),
 | 
					      new webpack.NamedModulesPlugin(),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user