Skip to content

Commit 62c56dd

Browse files
authored
New packager (codesandbox#225)
* Intermediate * Rewrite path resolve system * Performance rewrites * Bundler fixes * Dynamic dependency loading * Allow non patrons * Process test cases * Fix cyclic dependencies * Fix error reporting
1 parent 7cc1ab7 commit 62c56dd

File tree

44 files changed

+1132
-357
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1132
-357
lines changed

config/webpack.prod.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ module.exports = merge(commonConfig, {
196196
},
197197
},
198198
{
199-
urlPattern: /https:\/\/d3i2v4dxqvxaq9\.cloudfront\.net/,
199+
urlPattern: /https:\/\/d1jyvh0kxilfa7\.cloudfront\.net/,
200200
handler: 'fastest',
201201
options: {
202202
cache: {
@@ -205,6 +205,16 @@ module.exports = merge(commonConfig, {
205205
},
206206
},
207207
},
208+
{
209+
urlPattern: /^https:\/\/unpkg\.com/,
210+
handler: 'cacheFirst',
211+
options: {
212+
cache: {
213+
maxEntries: 300,
214+
name: 'unpkg-dep-cache',
215+
},
216+
},
217+
},
208218
{
209219
urlPattern: /cloudflare\.com/,
210220
handler: 'cacheFirst',

src/app/components/sandbox/CodeEditor/Monaco.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import theme from 'common/theme';
1515
import getTemplate from 'common/templates';
1616

1717
/* eslint-disable import/no-webpack-loader-syntax */
18-
import SyntaxHighlightWorker from 'worker-loader!./monaco/workers/syntax-highlighter';
19-
import LinterWorker from 'worker-loader!./monaco/workers/linter';
20-
import TypingsFetcherWorker from 'worker-loader!./monaco/workers/fetch-dependency-typings';
18+
import SyntaxHighlightWorker from 'worker-loader?inline!./monaco/workers/syntax-highlighter';
19+
import LinterWorker from 'worker-loader?inline!./monaco/workers/linter';
20+
import TypingsFetcherWorker from 'worker-loader?inline!./monaco/workers/fetch-dependency-typings';
2121
/* eslint-enable import/no-webpack-loader-syntax */
2222

2323
import enableEmmet from './monaco/enable-emmet';
@@ -606,7 +606,9 @@ export default class CodeEditor extends React.Component<Props, State> {
606606
this.sizeProbeInterval = setInterval(this.resizeEditor.bind(this), 3000);
607607

608608
if (this.props.dependencies) {
609-
this.fetchDependencyTypings(this.props.dependencies, monaco);
609+
setTimeout(() => {
610+
this.fetchDependencyTypings(this.props.dependencies, monaco);
611+
}, 5000);
610612
}
611613

612614
editor.addAction({

src/app/components/sandbox/Preview/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ export default class Preview extends React.PureComponent<Props, State> {
259259
template,
260260
hasActions: !!runActionFromPreview,
261261
isModuleView: !isInProjectView,
262+
// TODO remove this in 2 weeks
263+
experimentalPackager: preferences.newPackagerExperiment,
262264
});
263265
};
264266

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React from 'react';
2+
import { connect } from 'react-redux';
3+
import { bindActionCreators } from 'redux';
4+
5+
import { preferencesSelector } from 'app/store/preferences/selectors';
6+
import preferencesActionCreators from 'app/store/preferences/actions';
7+
8+
import {
9+
Container,
10+
PreferenceContainer,
11+
PaddedPreference,
12+
Description,
13+
} from '../styles';
14+
15+
type Props = {
16+
preferencesActions: typeof preferencesActionCreators,
17+
preferences: Object,
18+
};
19+
20+
const mapDispatchToProps = dispatch => ({
21+
preferencesActions: bindActionCreators(preferencesActionCreators, dispatch),
22+
});
23+
const mapStateToProps = state => ({
24+
preferences: preferencesSelector(state),
25+
});
26+
const Preferences = ({ preferences, preferencesActions }: Props) => {
27+
const bindValue = name => ({
28+
value: preferences[name],
29+
setValue: value =>
30+
preferencesActions.setPreference({
31+
[name]: value,
32+
}),
33+
});
34+
return (
35+
<Container>
36+
<PreferenceContainer>
37+
<PaddedPreference
38+
title="New dependency bundler"
39+
type="boolean"
40+
{...bindValue('newPackagerExperiment')}
41+
/>
42+
<Description>Use the new, faster dependency bundler.</Description>
43+
</PreferenceContainer>
44+
</Container>
45+
);
46+
};
47+
48+
export default connect(mapStateToProps, mapDispatchToProps)(Preferences);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react';
2+
3+
import Preferences from './Preferences';
4+
import Title from '../MenuTitle';
5+
6+
export default () => (
7+
<div>
8+
<Title>Experiments</Title>
9+
10+
<Preferences />
11+
</div>
12+
);

src/app/containers/Preferences/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import CodeIcon from 'react-icons/lib/fa/code';
99
import CreditCardIcon from 'react-icons/lib/md/credit-card';
1010
import BrowserIcon from 'react-icons/lib/go/browser';
1111
import StarIcon from 'react-icons/lib/go/star';
12+
import FlaskIcon from 'react-icons/lib/fa/flask';
1213
import CodeFormatIcon from 'react-icons/lib/fa/dedent';
1314
import IntegrationIcon from 'react-icons/lib/md/device-hub';
1415

@@ -20,6 +21,7 @@ import CodeFormatting from './CodeFormatting';
2021
import PaymentInfo from './PaymentInfo';
2122
import Integrations from './Integrations';
2223
import Badges from './Badges';
24+
import Experiments from './Experiments';
2325

2426
const Container = styled.div`
2527
display: flex;
@@ -85,6 +87,11 @@ class Preferences extends React.PureComponent {
8587
icon: <StarIcon />,
8688
content: <Badges />,
8789
},
90+
{
91+
title: 'Experiments',
92+
icon: <FlaskIcon />,
93+
content: <Experiments />,
94+
},
8895
].filter(x => x);
8996
};
9097

src/app/store/preferences/keys.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ export const fontFamily = 'settings.fontfamily';
1010
export const clearConsoleEnabled = 'settings.clearconsole';
1111
export const codeMirror = 'settings.codemirror';
1212
export const autoDownloadTypes = 'settings.autoDownloadTypes';
13+
export const newPackagerExperiment = 'settings.newPackagerExperiment';

src/app/store/preferences/reducer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ const initialState: Preferences = Object.keys(keys).reduce(
4545
prettierConfig: DEFAULT_PRETTIER_CONFIG,
4646
codeMirror: false,
4747
autoDownloadTypes: true,
48+
newPackagerExperiment: false,
4849
}
4950
);
5051

src/app/store/preview-actions-api/actions.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
// This executes all actions that are requested by the preview
2+
import resolveModule from 'common/sandbox/resolve-module';
23

34
import notifActions from '../notifications/actions';
45
import moduleActions from '../entities/sandboxes/modules/actions';
56
import sandboxActions from '../entities/sandboxes/actions';
7+
import { modulesFromSandboxSelector } from '../entities/sandboxes/modules/selectors';
8+
import { directoriesFromSandboxSelector } from '../entities/sandboxes/directories/selectors';
9+
import { singleSandboxSelector } from '../entities/sandboxes/selectors';
610

711
export default {
8-
executeAction: action => async (dispatch: Function) => {
12+
executeAction: action => async (dispatch: Function, getState: Function) => {
913
switch (action.action) {
1014
case 'notification': {
1115
const { title, timeAlive, notificationType } = action;
@@ -20,10 +24,21 @@ export default {
2024
return dispatch(moduleActions.addCorrection(action.moduleId, action));
2125
}
2226
case 'source.module.rename': {
23-
const { sandboxId, moduleId, title } = action;
24-
return dispatch(
25-
sandboxActions.renameModule(sandboxId, moduleId, title)
26-
);
27+
const { sandboxId, path, title } = action;
28+
29+
const sandbox = singleSandboxSelector(getState(), { id: sandboxId });
30+
const modules = modulesFromSandboxSelector(getState(), { sandbox });
31+
const directories = directoriesFromSandboxSelector(getState(), {
32+
sandbox,
33+
});
34+
35+
const module = resolveModule(path, modules, directories);
36+
if (module) {
37+
return dispatch(
38+
sandboxActions.renameModule(sandboxId, module.id, title)
39+
);
40+
}
41+
return null;
2742
}
2843
case 'source.dependencies.add': {
2944
const { sandboxId, dependency } = action;

src/common/types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ export type Preferences = {
158158
clearConsoleEnabled: ?boolean,
159159
prettierConfig: Object,
160160
autoDownloadTypes: ?boolean,
161+
newPackagerExperiment: ?boolean,
161162
};
162163

163164
export type NotificationButton = {

0 commit comments

Comments
 (0)