Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sync utils #1171

Merged
merged 4 commits into from Mar 18, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 4 additions & 5 deletions packages/react-cosmos/src/getFixtureUrls.ts
Expand Up @@ -13,18 +13,17 @@ type Args = {
fullScreen?: boolean;
};

export async function getFixtureUrls({
cosmosConfig,
fullScreen = false
}: Args) {
export const getFixtureUrls = async (args: Args) => getFixtureUrlsSync(args);

export function getFixtureUrlsSync({ cosmosConfig, fullScreen = false }: Args) {
const host = getPlaygroundHost(cosmosConfig);
const fixtureUrls: string[] = [];

function pushFixtureUrl(fixtureId: FixtureId) {
fixtureUrls.push(createFixtureUrl(host, fixtureId, fullScreen));
}

const { fixtureExportsByPath } = await getUserModules(cosmosConfig);
const { fixtureExportsByPath } = getUserModules(cosmosConfig);
const fixtureNamesByPath = getFixtureNamesByPath(fixtureExportsByPath);
Object.keys(fixtureNamesByPath).forEach(fixturePath => {
const fixtureNames = fixtureNamesByPath[fixturePath];
Expand Down
6 changes: 4 additions & 2 deletions packages/react-cosmos/src/getFixtures.tsx
Expand Up @@ -21,8 +21,10 @@ type RenderableFixture = {
getElement: () => React.ReactElement<any>;
};

export async function getFixtures({ cosmosConfig }: Args) {
const { fixtureExportsByPath, decoratorsByPath } = await getUserModules(
export const getFixtures = async (args: Args) => getFixturesSync(args);

export function getFixturesSync({ cosmosConfig }: Args) {
const { fixtureExportsByPath, decoratorsByPath } = getUserModules(
cosmosConfig
);

Expand Down
4 changes: 2 additions & 2 deletions packages/react-cosmos/src/index.ts
Expand Up @@ -3,5 +3,5 @@ export {
detectCosmosConfig,
getCosmosConfigAtPath
} from './config';
export { getFixtures } from './getFixtures';
export { getFixtureUrls } from './getFixtureUrls';
export { getFixtures, getFixturesSync } from './getFixtures';
export { getFixtureUrls, getFixtureUrlsSync } from './getFixtureUrls';
16 changes: 5 additions & 11 deletions packages/react-cosmos/src/plugins/userDepsFile.tsx
@@ -1,8 +1,7 @@
import { FSWatcher, watch } from 'chokidar';
import { writeFile } from 'fs';
import { writeFileSync } from 'fs';
import { debounce } from 'lodash';
import path from 'path';
import promisify from 'util.promisify';
import { CosmosConfig } from '../config';
import { DevServerPluginArgs } from '../shared/devServer';
import { NativeRendererConfig } from '../shared/rendererConfig';
Expand All @@ -13,10 +12,8 @@ import {
getIgnorePatterns
} from '../shared/userDeps';

const writeFileAsync = promisify(writeFile);

export async function userDepsFile({ cosmosConfig }: DevServerPluginArgs) {
await generateUserDepsFile(cosmosConfig);
generateUserDepsFile(cosmosConfig);
const watcher = await startFixtureFileWatcher(cosmosConfig);
return () => {
watcher.close();
Expand Down Expand Up @@ -47,15 +44,12 @@ async function startFixtureFileWatcher(
});
}

async function generateUserDepsFile(cosmosConfig: CosmosConfig) {
function generateUserDepsFile(cosmosConfig: CosmosConfig) {
const { userDepsFilePath, port } = cosmosConfig;

const rendererConfig: NativeRendererConfig = { port };
const userDepsModule = await generateUserDepsModule(
cosmosConfig,
rendererConfig
);
await writeFileAsync(userDepsFilePath, userDepsModule, 'utf8');
const userDepsModule = generateUserDepsModule(cosmosConfig, rendererConfig);
writeFileSync(userDepsFilePath, userDepsModule, 'utf8');

const relUserDepsFilePath = path.relative(process.cwd(), userDepsFilePath);
console.log(`[Cosmos] Generated ${relUserDepsFilePath}`);
Expand Down
Expand Up @@ -2,16 +2,10 @@ import { detectCosmosConfig } from '../../../config';
import { DomRendererConfig } from '../../../shared/rendererConfig';
import { generateUserDepsModule } from '../../../shared/userDeps';
import { createDomCosmosConfig } from '../cosmosConfig/dom';
import { loader } from 'webpack';

type WebpackLoaderContext = {
async(): (error: Error | null, result: string | Buffer) => unknown;
addContextDependency(directory: string): unknown;
};

module.exports = async function injectUserDeps(source: string) {
module.exports = function injectUserDeps(this: loader.LoaderContext) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My first time having to do this (excuse the pun).

It's a pseudo parameter.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

馃啋

const cosmosConfig = detectCosmosConfig();
const webpackLoaderContext = (this as any) as WebpackLoaderContext;
const callback = webpackLoaderContext.async();

// This ensures this loader is invalidated whenever a new file is added to or
// removed from user's project, which in turn triggers react-cosmos-voyager2
Expand All @@ -21,15 +15,9 @@ module.exports = async function injectUserDeps(source: string) {
// automatically bundles new files that match the watcher's query.
// https://github.com/webpack/webpack/issues/222#issuecomment-40691546
const watchDirs = cosmosConfig.watchDirs;
watchDirs.forEach(watchDir =>
webpackLoaderContext.addContextDependency(watchDir)
);
watchDirs.forEach(watchDir => this.addContextDependency(watchDir));

const { containerQuerySelector } = createDomCosmosConfig(cosmosConfig);
const rendererConfig: DomRendererConfig = { containerQuerySelector };
const userDepsModule = await generateUserDepsModule(
cosmosConfig,
rendererConfig
);
callback(null, userDepsModule);
return generateUserDepsModule(cosmosConfig, rendererConfig);
};
@@ -1,6 +1,5 @@
import glob from 'glob';
import micromatch from 'micromatch';
import promisify from 'util.promisify';
import {
getFixturePatterns,
getDecoratorPatterns,
Expand All @@ -18,14 +17,12 @@ type UserModulePaths = {
decoratorPaths: string[];
};

const globAsync = promisify(glob);

export async function findUserModulePaths({
export function findUserModulePaths({
rootDir,
fixturesDir,
fixtureFileSuffix
}: FindUserModulePathsArgs): Promise<UserModulePaths> {
const paths = await globAsync('**/*', {
}: FindUserModulePathsArgs): UserModulePaths {
const paths = glob.sync('**/*', {
cwd: rootDir,
absolute: true,
ignore: getIgnorePatterns()
Expand Down
Expand Up @@ -4,18 +4,18 @@ import slash from 'slash';
import { findUserModulePaths } from './findUserModulePaths';

// Warning: Renderer config must be serializable!
export async function generateUserDepsModule(
export function generateUserDepsModule(
cosmosConfig: CosmosConfig,
rendererConfig: {}
): Promise<string> {
): string {
const {
rootDir,
fixturesDir,
fixtureFileSuffix,
globalImports
} = cosmosConfig;

const { fixturePaths, decoratorPaths } = await findUserModulePaths({
const { fixturePaths, decoratorPaths } = findUserModulePaths({
rootDir,
fixturesDir,
fixtureFileSuffix
Expand Down
6 changes: 3 additions & 3 deletions packages/react-cosmos/src/shared/userDeps/getUserModules.ts
Expand Up @@ -14,12 +14,12 @@ type UserModules = {
decoratorsByPath: ReactDecoratorsByPath;
};

export async function getUserModules({
export function getUserModules({
rootDir,
fixturesDir,
fixtureFileSuffix
}: CosmosConfig): Promise<UserModules> {
const { fixturePaths, decoratorPaths } = await findUserModulePaths({
}: CosmosConfig): UserModules {
const { fixturePaths, decoratorPaths } = findUserModulePaths({
rootDir,
fixturesDir,
fixtureFileSuffix
Expand Down