Skip to content

Commit b73db70

Browse files
authored
Support dynamic typescript version from package.json (codesandbox#1843)
* Support dynamic typescript version from package.json Fixes codesandbox#942 Fixes codesandbox#1683 * Fix typings * Fix typings * Allow for extension of package.json
1 parent 06814ca commit b73db70

File tree

8 files changed

+59
-16
lines changed

8 files changed

+59
-16
lines changed

packages/app/src/sandbox/eval/transpilers/typescript/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import TypeScriptWorker from 'worker-loader?publicPath=/&name=typescript-transpi
44
import WorkerTranspiler from '../worker-transpiler';
55
import { LoaderContext } from '../../transpiled-module';
66
import { TranspilerResult } from '..';
7+
import { getDependenciesFromConfig } from 'sandbox/eval/utils/get-dependencies';
78

89
class TypeScriptTranspiler extends WorkerTranspiler {
910
worker: Worker;
@@ -20,6 +21,7 @@ class TypeScriptTranspiler extends WorkerTranspiler {
2021
const path = loaderContext.path;
2122

2223
let foundConfig = null;
24+
let typescriptVersion = '3.4.1';
2325
if (
2426
loaderContext.options.configurations &&
2527
loaderContext.options.configurations.typescript &&
@@ -28,11 +30,19 @@ class TypeScriptTranspiler extends WorkerTranspiler {
2830
foundConfig = loaderContext.options.configurations.typescript.parsed;
2931
}
3032

33+
const dependencies = getDependenciesFromConfig(
34+
loaderContext.options.configurations
35+
);
36+
if (dependencies && dependencies.typescript) {
37+
typescriptVersion = dependencies.typescript;
38+
}
39+
3140
this.queueTask(
3241
{
3342
code,
3443
path,
3544
config: foundConfig,
45+
typescriptVersion,
3646
},
3747
loaderContext._module.getId(),
3848
loaderContext,

packages/app/src/sandbox/eval/transpilers/typescript/typescript-worker.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { buildWorkerError } from '../utils/worker-error-handler';
22
import getDependencies from './get-require-statements';
33

44
self.importScripts([
5-
'https://cdnjs.cloudflare.com/ajax/libs/typescript/2.7.2/typescript.min.js',
5+
'https://cdnjs.cloudflare.com/ajax/libs/typescript/3.4.1/typescript.min.js',
66
]);
77

88
self.postMessage('ready');
@@ -20,7 +20,13 @@ declare var ts: {
2020
};
2121

2222
self.addEventListener('message', event => {
23-
const { code, path, config } = event.data;
23+
const { code, path, config, typescriptVersion } = event.data;
24+
25+
if (typescriptVersion !== '3.4.1') {
26+
self.importScripts(
27+
`https://unpkg.com/typescript@${typescriptVersion}/lib/typescript.js`
28+
);
29+
}
2430

2531
const defaultConfig = {
2632
fileName: path,
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { ParsedConfigurationFiles } from '@codesandbox/common/lib/templates/template';
2+
3+
export function getDependenciesFromConfig(
4+
configurations: ParsedConfigurationFiles
5+
) {
6+
if (
7+
configurations &&
8+
configurations.package &&
9+
configurations.package.parsed
10+
) {
11+
return {
12+
...configurations.package.parsed.devDependencies,
13+
...configurations.package.parsed.dependencies,
14+
};
15+
}
16+
17+
return {};
18+
}

packages/common/src/templates/angular.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
31
import { absolute, join } from '../utils/path';
42

53
import Template, { ParsedConfigurationFiles } from './template';
@@ -94,7 +92,7 @@ class AngularTemplate extends Template {
9492
if (!configurationFiles['angular-config'].generated) {
9593
const { parsed } = configurationFiles['angular-config'];
9694
entries = entries.concat(getAngularJSONHTMLEntry(parsed));
97-
} else {
95+
} else if (configurationFiles['angular-cli']) {
9896
const { parsed } = configurationFiles['angular-cli'];
9997
entries = entries.concat(getAngularCLIHTMLEntry(parsed));
10098
}

packages/common/src/templates/configuration/types.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import { Sandbox } from '../../types';
32

43
export type ConfigurationFile = {
@@ -18,8 +17,8 @@ export type ConfigurationFile = {
1817
partialSupportDisclaimer?: string;
1918
};
2019

21-
export type ParsedConfigurationFile = {
22-
parsed?: any;
20+
export type ParsedConfigurationFile<T> = {
21+
parsed?: T;
2322
code: string;
2423
generated: boolean;
2524
error?: Error;

packages/common/src/templates/template.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,16 @@ export type ConfigurationFiles = {
2626
[path: string]: ConfigurationFile;
2727
};
2828

29+
export type Dependencies = { [name: string]: string };
30+
2931
export type ParsedConfigurationFiles = {
30-
[path: string]: ParsedConfigurationFile;
32+
package?: ParsedConfigurationFile<{
33+
main: string;
34+
dependencies?: Dependencies;
35+
devDependencies: Dependencies;
36+
[otherProperties: string]: any | undefined;
37+
}>;
38+
[path: string]: ParsedConfigurationFile<any> | undefined;
3139
};
3240

3341
const defaultConfigurations = {
@@ -180,7 +188,7 @@ export default class Template {
180188
}
181189

182190
// eslint-disable-next-line no-unused-vars
183-
getHTMLEntries(configurationFiles: { [type: string]: Object }): string[] {
191+
getHTMLEntries(configurationFiles: ParsedConfigurationFiles): string[] {
184192
return ['/public/index.html', '/index.html'];
185193
}
186194

packages/common/src/templates/vue.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import Template, { ParsedConfigurationFiles } from './template';
32
import { decorateSelector } from '../theme';
43
import configurations from './configuration';
@@ -14,9 +13,7 @@ class VueTemplate extends Template {
1413
}
1514

1615
// eslint-disable-next-line no-unused-vars
17-
getHTMLEntries(configurationFiles: {
18-
[type: string]: Object;
19-
}): Array<string> {
16+
getHTMLEntries(configurationFiles: ParsedConfigurationFiles): Array<string> {
2017
return ['/static/index.html', '/index.html'];
2118
}
2219
}

packages/common/src/utils/is-babel-7.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import semver from 'semver';
2+
import { Dependencies } from '../templates/template';
23

3-
function isCRAVersion2(dependencies: object, devDependencies: object) {
4+
function isCRAVersion2(
5+
dependencies: Dependencies,
6+
devDependencies: Dependencies
7+
) {
48
const reactScriptsVersion =
59
dependencies['react-scripts'] || devDependencies['react-scripts'];
610
if (reactScriptsVersion) {
@@ -14,7 +18,10 @@ function isCRAVersion2(dependencies: object, devDependencies: object) {
1418
return false;
1519
}
1620

17-
export function isBabel7(dependencies = {}, devDependencies = {}) {
21+
export function isBabel7(
22+
dependencies: Dependencies = {},
23+
devDependencies: Dependencies = {}
24+
) {
1825
if (devDependencies['@vue/cli-plugin-babel']) {
1926
return true;
2027
}

0 commit comments

Comments
 (0)