mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
feat(webpack): consider prereleases in runtime detection for commonjs auto-fallback
This commit is contained in:
@@ -2,6 +2,7 @@ import { extname, relative, resolve } from 'path';
|
|||||||
import { ContextExclusionPlugin, HotModuleReplacementPlugin } from 'webpack';
|
import { ContextExclusionPlugin, HotModuleReplacementPlugin } from 'webpack';
|
||||||
import Config from 'webpack-chain';
|
import Config from 'webpack-chain';
|
||||||
import { satisfies } from 'semver';
|
import { satisfies } from 'semver';
|
||||||
|
import { isVersionGteConsideringPrerelease } from '../helpers/dependencies';
|
||||||
import { existsSync } from 'fs';
|
import { existsSync } from 'fs';
|
||||||
|
|
||||||
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
|
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
|
||||||
@@ -64,7 +65,7 @@ export default function (config: Config, env: IWebpackEnv = _env): Config {
|
|||||||
getResolvedDependencyVersionForCheck('@nativescript/ios', '9.0.0') ??
|
getResolvedDependencyVersionForCheck('@nativescript/ios', '9.0.0') ??
|
||||||
iosVersion ??
|
iosVersion ??
|
||||||
undefined;
|
undefined;
|
||||||
if (iosResolved && satisfies(iosResolved, '>=9.0.0')) {
|
if (isVersionGteConsideringPrerelease(iosResolved, '9.0.0')) {
|
||||||
useSourceMapFiles();
|
useSourceMapFiles();
|
||||||
} else {
|
} else {
|
||||||
env.commonjs = true;
|
env.commonjs = true;
|
||||||
@@ -77,7 +78,7 @@ export default function (config: Config, env: IWebpackEnv = _env): Config {
|
|||||||
) ??
|
) ??
|
||||||
visionosVersion ??
|
visionosVersion ??
|
||||||
undefined;
|
undefined;
|
||||||
if (visionosResolved && satisfies(visionosResolved, '>=9.0.0')) {
|
if (isVersionGteConsideringPrerelease(visionosResolved, '9.0.0')) {
|
||||||
useSourceMapFiles();
|
useSourceMapFiles();
|
||||||
} else {
|
} else {
|
||||||
env.commonjs = true;
|
env.commonjs = true;
|
||||||
@@ -90,7 +91,7 @@ export default function (config: Config, env: IWebpackEnv = _env): Config {
|
|||||||
) ??
|
) ??
|
||||||
androidVersion ??
|
androidVersion ??
|
||||||
undefined;
|
undefined;
|
||||||
if (androidResolved && satisfies(androidResolved, '>=9.0.0')) {
|
if (isVersionGteConsideringPrerelease(androidResolved, '9.0.0')) {
|
||||||
useSourceMapFiles();
|
useSourceMapFiles();
|
||||||
} else {
|
} else {
|
||||||
env.commonjs = true;
|
env.commonjs = true;
|
||||||
|
|||||||
@@ -76,7 +76,10 @@ export function getDependencyVersion(dependencyName: string): string | null {
|
|||||||
* - fall back to declared version in project package.json (dependencies/devDependencies)
|
* - fall back to declared version in project package.json (dependencies/devDependencies)
|
||||||
* - if declared is a common dist-tag (alpha|beta|rc|next) return a 9.x prerelease
|
* - if declared is a common dist-tag (alpha|beta|rc|next) return a 9.x prerelease
|
||||||
*/
|
*/
|
||||||
export function getResolvedDependencyVersionForCheck(dependencyName: string, target: string): string | null {
|
export function getResolvedDependencyVersionForCheck(
|
||||||
|
dependencyName: string,
|
||||||
|
target: string,
|
||||||
|
): string | null {
|
||||||
// try installed
|
// try installed
|
||||||
const installed = getDependencyVersion(dependencyName);
|
const installed = getDependencyVersion(dependencyName);
|
||||||
if (installed) {
|
if (installed) {
|
||||||
@@ -85,19 +88,17 @@ export function getResolvedDependencyVersionForCheck(dependencyName: string, tar
|
|||||||
|
|
||||||
// try declared in project package.json
|
// try declared in project package.json
|
||||||
const pkg = getPackageJson();
|
const pkg = getPackageJson();
|
||||||
const declared = (pkg.dependencies && pkg.dependencies[dependencyName]) || (pkg.devDependencies && pkg.devDependencies[dependencyName]);
|
const declared =
|
||||||
|
(pkg.dependencies && pkg.dependencies[dependencyName]) ||
|
||||||
|
(pkg.devDependencies && pkg.devDependencies[dependencyName]);
|
||||||
if (!declared) {
|
if (!declared) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if declared already satisfies semver check, use it
|
// if declared already satisfies semver check, use it
|
||||||
try {
|
// Note: declared may be a dist-tag like 'alpha' or a range. We only treat
|
||||||
if (satisfies(declared, `>=${target}`)) {
|
// common tags as prereleases of target. Avoid trying to interpret arbitrary
|
||||||
return declared;
|
// ranges here.
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// ignore parse errors
|
|
||||||
}
|
|
||||||
|
|
||||||
// common dist-tags -> treat as prerelease of 9.x for the purpose of >=9 checks
|
// common dist-tags -> treat as prerelease of 9.x for the purpose of >=9 checks
|
||||||
if (/^(alpha|beta|rc|next)$/.test(String(declared))) {
|
if (/^(alpha|beta|rc|next)$/.test(String(declared))) {
|
||||||
@@ -106,3 +107,38 @@ export function getResolvedDependencyVersionForCheck(dependencyName: string, tar
|
|||||||
|
|
||||||
return declared ?? null;
|
return declared ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Numeric comparison that treats prerelease versions as being at the same
|
||||||
|
* numeric level as their base version. e.g. 9.0.0-alpha.2 >= 9.0.0
|
||||||
|
*/
|
||||||
|
export function isVersionGteConsideringPrerelease(
|
||||||
|
version: string | null | undefined,
|
||||||
|
target: string,
|
||||||
|
): boolean {
|
||||||
|
if (!version) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const v = require('semver').parse(String(version));
|
||||||
|
const t = require('semver').parse(String(target));
|
||||||
|
if (!v || !t) {
|
||||||
|
// fallback to semver.satisfies with a prerelease-aware lower bound
|
||||||
|
return require('semver').satisfies(String(version), `>=${target}-0`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v.major > t.major) return true;
|
||||||
|
if (v.major < t.major) return false;
|
||||||
|
if (v.minor > t.minor) return true;
|
||||||
|
if (v.minor < t.minor) return false;
|
||||||
|
if (v.patch >= t.patch) return true;
|
||||||
|
return false;
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
return require('semver').satisfies(String(version), `>=${target}-0`);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user