Adjustments to support chinese versions

pull/1044/merge
Tobias Springer 3 years ago
parent e53ec8d6af
commit 1ee03d7398

1
.gitignore vendored

@ -46,6 +46,7 @@ res_built
gulp/runnable-texturepacker.jar gulp/runnable-texturepacker.jar
tmp_standalone_files tmp_standalone_files
tmp_standalone_files_china
# Local config # Local config
config.local.js config.local.js

@ -21,7 +21,6 @@ function gulptasksCSS($, gulp, buildFolder, browserSync) {
const plugins = [postcssAssetsPlugin(cachebust)]; const plugins = [postcssAssetsPlugin(cachebust)];
if (prod) { if (prod) {
plugins.unshift( plugins.unshift(
$.postcssUnprefix(),
$.postcssPresetEnv({ $.postcssPresetEnv({
browsers: ["> 0.1%"], browsers: ["> 0.1%"],
}) })

@ -136,7 +136,7 @@ gulp.task("main.webserver", () => {
); );
}); });
function serve({ standalone }) { function serve({ standalone, chineseVersion = false }) {
browserSync.init({ browserSync.init({
server: buildFolder, server: buildFolder,
port: 3005, port: 3005,
@ -200,7 +200,11 @@ function serve({ standalone }) {
if (standalone) { if (standalone) {
gulp.series("js.standalone-dev.watch")(() => true); gulp.series("js.standalone-dev.watch")(() => true);
} else { } else {
gulp.series("js.dev.watch")(() => true); if (chineseVersion) {
gulp.series("china.js.dev.watch")(() => true);
} else {
gulp.series("js.dev.watch")(() => true);
}
} }
} }
@ -284,30 +288,28 @@ gulp.task(
); );
// Builds everything (standalone-prod) // Builds everything (standalone-prod)
gulp.task(
"step.standalone-prod.code",
gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-prod")
);
gulp.task("step.standalone-prod.mainbuild", gulp.parallel("step.baseResources", "step.standalone-prod.code"));
gulp.task(
"step.standalone-prod.all",
gulp.series("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
);
gulp.task(
"build.standalone-prod",
gulp.series("utils.cleanup", "step.standalone-prod.all", "step.postbuild")
);
// OS X build and release upload for (const prefix of ["", "china."]) {
gulp.task( gulp.task(
"build.darwin64-prod", prefix + "step.standalone-prod.code",
gulp.series( gulp.series("sounds.fullbuildHQ", "translations.fullBuild", prefix + "js.standalone-prod")
"build.standalone-prod", );
"standalone.prepare",
"standalone.package.prod.darwin64", gulp.task(
"standalone.uploadRelease.darwin64" prefix + "step.standalone-prod.mainbuild",
) gulp.parallel("step.baseResources", prefix + "step.standalone-prod.code")
); );
gulp.task(
prefix + "step.standalone-prod.all",
gulp.series(prefix + "step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
);
gulp.task(
prefix + "build.standalone-prod",
gulp.series("utils.cleanup", prefix + "step.standalone-prod.all", "step.postbuild")
);
}
// Deploying! // Deploying!
gulp.task( gulp.task(
@ -320,7 +322,12 @@ gulp.task(
); );
gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod")); gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod"));
gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod")); gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod"));
gulp.task("main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod")); gulp.task("regular.main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
gulp.task(
"china.main.standalone",
gulp.series("china.build.standalone-prod", "china.standalone.package.prod")
);
gulp.task("standalone.all", gulp.series("regular.main.standalone", "china.main.standalone"));
// Live-development // Live-development
gulp.task( gulp.task(
@ -331,5 +338,9 @@ gulp.task(
"main.serveStandalone", "main.serveStandalone",
gulp.series("build.standalone.dev", () => serve({ standalone: true })) gulp.series("build.standalone.dev", () => serve({ standalone: true }))
); );
gulp.task(
"china.main.serveDev",
gulp.series("build.dev", () => serve({ standalone: false, chineseVersion: true }))
);
gulp.task("default", gulp.series("main.serveDev")); gulp.task("default", gulp.series("main.serveDev"));

@ -6,7 +6,6 @@ function requireUncached(module) {
} }
function gulptasksJS($, gulp, buildFolder, browserSync) { function gulptasksJS($, gulp, buildFolder, browserSync) {
//// DEV //// DEV
gulp.task("js.dev.watch", () => { gulp.task("js.dev.watch", () => {
@ -30,6 +29,36 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
.pipe(gulp.dest(buildFolder)); .pipe(gulp.dest(buildFolder));
}); });
//// DEV CHINA
gulp.task("china.js.dev.watch", () => {
return gulp
.src("../src/js/main.js")
.pipe(
$.webpackStream(
requireUncached("./webpack.config.js")({
watch: true,
chineseVersion: true,
})
)
)
.pipe(gulp.dest(buildFolder))
.pipe(browserSync.stream());
});
gulp.task("china.js.dev", () => {
return gulp
.src("../src/js/main.js")
.pipe(
$.webpackStream(
requireUncached("./webpack.config.js")({
chineseVersion: true,
})
)
)
.pipe(gulp.dest(buildFolder));
});
//// STAGING //// STAGING
gulp.task("js.staging.transpiled", () => { gulp.task("js.staging.transpiled", () => {
@ -162,6 +191,23 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
) )
.pipe(gulp.dest(buildFolder)); .pipe(gulp.dest(buildFolder));
}); });
gulp.task("china.js.standalone-prod", () => {
return gulp
.src("../src/js/main.js")
.pipe(
$.webpackStream(
requireUncached("./webpack.production.config.js")({
enableAssert: false,
environment: "prod",
es6: true,
standalone: true,
chineseVersion: true,
})
)
)
.pipe(gulp.dest(buildFolder));
});
} }
module.exports = { module.exports = {

@ -34,6 +34,7 @@
"fastdom": "^1.0.9", "fastdom": "^1.0.9",
"flatted": "^2.0.1", "flatted": "^2.0.1",
"fs-extra": "^8.1.0", "fs-extra": "^8.1.0",
"gifsicle": "^5.2.0",
"gulp-audiosprite": "^1.1.0", "gulp-audiosprite": "^1.1.0",
"howler": "^2.1.2", "howler": "^2.1.2",
"html-loader": "^0.5.5", "html-loader": "^0.5.5",

@ -10,226 +10,168 @@ const execSync = require("child_process").execSync;
function gulptasksStandalone($, gulp) { function gulptasksStandalone($, gulp) {
const electronBaseDir = path.join(__dirname, "..", "electron"); const electronBaseDir = path.join(__dirname, "..", "electron");
const tempDestDir = path.join(__dirname, "..", "tmp_standalone_files"); for (const { tempDestDir, suffix, taskPrefix } of [
const tempDestBuildDir = path.join(tempDestDir, "built"); { tempDestDir: path.join(__dirname, "..", "tmp_standalone_files"), suffix: "", taskPrefix: "" },
{
gulp.task("standalone.prepare.cleanup", () => { tempDestDir: path.join(__dirname, "..", "tmp_standalone_files_china"),
return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true })); suffix: "china",
}); taskPrefix: "china.",
},
gulp.task("standalone.prepare.copyPrefab", () => { ]) {
// const requiredFiles = $.glob.sync("../electron/"); const tempDestBuildDir = path.join(tempDestDir, "built");
const requiredFiles = [
path.join(electronBaseDir, "lib", "**", "*.node"), gulp.task(taskPrefix + "standalone.prepare.cleanup", () => {
path.join(electronBaseDir, "node_modules", "**", "*.*"), return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
path.join(electronBaseDir, "node_modules", "**", ".*"), });
path.join(electronBaseDir, "favicon*"),
gulp.task(taskPrefix + "standalone.prepare.copyPrefab", () => {
// fails on platforms which support symlinks // const requiredFiles = $.glob.sync("../electron/");
// https://github.com/gulpjs/gulp/issues/1427 const requiredFiles = [
// path.join(electronBaseDir, "node_modules", "**", "*"), path.join(electronBaseDir, "lib", "**", "*.node"),
]; path.join(electronBaseDir, "node_modules", "**", "*.*"),
return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir)); path.join(electronBaseDir, "node_modules", "**", ".*"),
}); path.join(electronBaseDir, "favicon*"),
gulp.task("standalone.prepare.writePackageJson", cb => { // fails on platforms which support symlinks
fs.writeFileSync( // https://github.com/gulpjs/gulp/issues/1427
path.join(tempDestBuildDir, "package.json"), // path.join(electronBaseDir, "node_modules", "**", "*"),
JSON.stringify( ];
{ return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir));
devDependencies: { });
electron: "6.1.12",
gulp.task(taskPrefix + "standalone.prepare.writePackageJson", cb => {
fs.writeFileSync(
path.join(tempDestBuildDir, "package.json"),
JSON.stringify(
{
devDependencies: {
electron: "6.1.12",
},
}, },
}, null,
null, 4
4 )
);
cb();
});
gulp.task(taskPrefix + "standalone.prepareVDF", cb => {
const hash = buildutils.getRevision();
const steampipeDir = path.join(__dirname, "steampipe", "scripts");
const templateContents = fs
.readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
.toString();
const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
cb();
});
gulp.task(taskPrefix + "standalone.prepare.minifyCode", () => {
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
});
gulp.task(taskPrefix + "standalone.prepare.copyGamefiles", () => {
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
});
gulp.task(taskPrefix + "standalone.killRunningInstances", cb => {
try {
execSync("taskkill /F /IM shapezio.exe");
} catch (ex) {
console.warn("Failed to kill running instances, maybe none are up.");
}
cb();
});
gulp.task(
taskPrefix + "standalone.prepare",
gulp.series(
taskPrefix + "standalone.killRunningInstances",
taskPrefix + "standalone.prepare.cleanup",
taskPrefix + "standalone.prepare.copyPrefab",
taskPrefix + "standalone.prepare.writePackageJson",
taskPrefix + "standalone.prepare.minifyCode",
taskPrefix + "standalone.prepare.copyGamefiles"
) )
); );
cb();
});
gulp.task("standalone.prepareVDF", cb => {
const hash = buildutils.getRevision();
const steampipeDir = path.join(__dirname, "steampipe", "scripts");
const templateContents = fs
.readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
.toString();
const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
cb();
});
gulp.task("standalone.prepare.minifyCode", () => {
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
});
gulp.task("standalone.prepare.copyGamefiles", () => { /**
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir)); *
}); * @param {'win32'|'linux'} platform
* @param {'x64'|'ia32'} arch
gulp.task("standalone.killRunningInstances", cb => { * @param {function():void} cb
try { */
execSync("taskkill /F /IM shapezio.exe"); function packageStandalone(platform, arch, cb) {
} catch (ex) { const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
console.warn("Failed to kill running instances, maybe none are up.");
} packager({
cb(); dir: tempDestBuildDir,
}); appCopyright: "Tobias Springer",
appVersion: getVersion(),
gulp.task( buildVersion: "1.0.0",
"standalone.prepare", arch,
gulp.series( platform,
"standalone.killRunningInstances", asar: true,
"standalone.prepare.cleanup", executableName: "shapezio",
"standalone.prepare.copyPrefab", icon: path.join(electronBaseDir, "favicon"),
"standalone.prepare.writePackageJson", name: "shapez.io-standalone" + suffix,
"standalone.prepare.minifyCode", out: tempDestDir,
"standalone.prepare.copyGamefiles" overwrite: true,
) appBundleId: "io.shapez.standalone",
); appCategoryType: "public.app-category.games",
}).then(
/** appPaths => {
* console.log("Packages created:", appPaths);
* @param {'win32'|'linux'|'darwin'} platform appPaths.forEach(appPath => {
* @param {'x64'|'ia32'} arch if (!fs.existsSync(appPath)) {
* @param {function():void} cb console.error("Bad app path gotten:", appPath);
* @param {boolean=} isRelease return;
*/ }
function packageStandalone(platform, arch, cb, isRelease = true) {
const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
packager({
dir: tempDestBuildDir,
appCopyright: "Tobias Springer",
appVersion: getVersion(),
buildVersion: "1.0.0",
arch,
platform,
asar: true,
executableName: "shapezio",
icon: path.join(electronBaseDir, "favicon"),
name: "shapez.io-standalone",
out: tempDestDir,
overwrite: true,
appBundleId: "io.shapez.standalone",
appCategoryType: "public.app-category.games",
...(isRelease &&
platform === "darwin" && {
osxSign: {
"identity": process.env.SHAPEZ_CLI_APPLE_CERT_NAME,
"hardened-runtime": true,
"hardenedRuntime": true,
"entitlements": "entitlements.plist",
"entitlements-inherit": "entitlements.plist",
"signature-flags": "library",
},
osxNotarize: {
appleId: process.env.SHAPEZ_CLI_APPLE_ID,
appleIdPassword: "@keychain:SHAPEZ_CLI_APPLE_ID",
},
}),
}).then(
appPaths => {
console.log("Packages created:", appPaths);
appPaths.forEach(appPath => {
if (!fs.existsSync(appPath)) {
console.error("Bad app path gotten:", appPath);
return;
}
fs.writeFileSync(
path.join(appPath, "LICENSE"),
fs.readFileSync(path.join(__dirname, "..", "LICENSE"))
);
fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
if (platform === "linux") {
fs.writeFileSync(
path.join(appPath, "play.sh"),
'#!/usr/bin/env bash\n./shapezio --no-sandbox "$@"\n'
);
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
}
if (process.platform === "win32" && platform === "darwin") {
console.warn(
"Cross-building for macOS on Windows: dereferencing symlinks.\n".red +
"This will nearly double app size and make code signature invalid. Sorry!\n"
.red.bold +
"For more information, see " +
"https://github.com/electron/electron-packager/issues/71".underline
);
// Clear up framework folders
fs.writeFileSync( fs.writeFileSync(
path.join(appPath, "play.sh"), path.join(appPath, "LICENSE"),
'#!/usr/bin/env bash\n./shapez.io-standalone.app/Contents/MacOS/shapezio --no-sandbox "$@"\n' fs.readFileSync(path.join(__dirname, "..", "LICENSE"))
);
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
fs.chmodSync(
path.join(appPath, "shapez.io-standalone.app", "Contents", "MacOS", "shapezio"),
0o775
); );
const finalPath = path.join(appPath, "shapez.io-standalone.app"); fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
const frameworksDir = path.join(finalPath, "Contents", "Frameworks"); if (platform === "linux") {
const frameworkFolders = fs fs.writeFileSync(
.readdirSync(frameworksDir) path.join(appPath, "play.sh"),
.filter(fname => fname.endsWith(".framework")); '#!/usr/bin/env bash\n./shapezio --no-sandbox "$@"\n'
);
for (let i = 0; i < frameworkFolders.length; ++i) { fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
const folderName = frameworkFolders[i]; }
const frameworkFolder = path.join(frameworksDir, folderName); });
console.log(" -> ", frameworkFolder);
const filesToDelete = fs cb();
.readdirSync(frameworkFolder) },
.filter(fname => fname.toLowerCase() !== "versions"); err => {
filesToDelete.forEach(fname => { console.error("Packaging error:", err);
console.log(" -> Deleting", fname); cb();
fs.unlinkSync(path.join(frameworkFolder, fname)); }
}); );
}
const frameworkSourceDir = path.join(frameworkFolder, "Versions", "A"); gulp.task(taskPrefix + "standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb));
fse.copySync(frameworkSourceDir, frameworkFolder); gulp.task(taskPrefix + "standalone.package.prod.linux64", cb =>
} packageStandalone("linux", "x64", cb)
}
});
cb();
},
err => {
console.error("Packaging error:", err);
cb();
}
); );
}
gulp.task("standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb)); gulp.task(
gulp.task("standalone.package.prod.win32", cb => packageStandalone("win32", "ia32", cb)); taskPrefix + "standalone.package.prod",
gulp.task("standalone.package.prod.linux64", cb => packageStandalone("linux", "x64", cb)); gulp.series(
gulp.task("standalone.package.prod.linux32", cb => packageStandalone("linux", "ia32", cb)); taskPrefix + "standalone.prepare",
gulp.task("standalone.package.prod.darwin64", cb => packageStandalone("darwin", "x64", cb)); gulp.parallel(
gulp.task("standalone.package.prod.darwin64.unsigned", cb => taskPrefix + "standalone.package.prod.win64",
packageStandalone("darwin", "x64", cb, false) taskPrefix + "standalone.package.prod.linux64"
); )
gulp.task(
"standalone.package.prod",
gulp.series(
"standalone.prepare",
gulp.parallel(
"standalone.package.prod.win64",
"standalone.package.prod.linux64",
"standalone.package.prod.darwin64"
) )
) );
); }
} }
module.exports = { gulptasksStandalone }; module.exports = { gulptasksStandalone };

@ -2,14 +2,16 @@
{ {
"appid" "1318690" "appid" "1318690"
"desc" "$DESC$" "desc" "$DESC$"
"buildoutput" "C:\work\shapez\shapez.io\gulp\steampipe\steamtemp" "buildoutput" "C:\work\shapez.io\gulp\steampipe\steamtemp"
"contentroot" "" "contentroot" ""
"setlive" "" "setlive" ""
"preview" "0" "preview" "0"
"local" "" "local" ""
"depots" "depots"
{ {
"1318691" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\windows.vdf" "1318691" "C:\work\shapez.io\gulp\steampipe\scripts\windows.vdf"
"1318692" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\linux.vdf" "1318694" "C:\work\shapez.io\gulp\steampipe\scripts\china-windows.vdf"
"1318692" "C:\work\shapez.io\gulp\steampipe\scripts\linux.vdf"
"1318695" "C:\work\shapez.io\gulp\steampipe\scripts\china-linux.vdf"
} }
} }

@ -0,0 +1,12 @@
"DepotBuildConfig"
{
"DepotID" "1318695"
"contentroot" "C:\work\shapez.io\tmp_standalone_files_china\shapez.io-standalone-linux-x64"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
"FileExclusion" "*.pdb"
}

@ -0,0 +1,12 @@
"DepotBuildConfig"
{
"DepotID" "1318694"
"contentroot" "C:\work\shapez.io\tmp_standalone_files_china\shapez.io-standalone-win32-x64"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
"FileExclusion" "*.pdb"
}

@ -1,7 +1,7 @@
"DepotBuildConfig" "DepotBuildConfig"
{ {
"DepotID" "1318692" "DepotID" "1318692"
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64" "contentroot" "C:\work\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64"
"FileMapping" "FileMapping"
{ {
"LocalPath" "*" "LocalPath" "*"

@ -1,7 +1,7 @@
"DepotBuildConfig" "DepotBuildConfig"
{ {
"DepotID" "1318691" "DepotID" "1318691"
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64" "contentroot" "C:\work\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64"
"FileMapping" "FileMapping"
{ {
"LocalPath" "*" "LocalPath" "*"

@ -6,7 +6,7 @@ const { getRevision, getVersion, getAllResourceImages } = require("./buildutils"
const lzString = require("lz-string"); const lzString = require("lz-string");
const CircularDependencyPlugin = require("circular-dependency-plugin"); const CircularDependencyPlugin = require("circular-dependency-plugin");
module.exports = ({ watch = false, standalone = false }) => { module.exports = ({ watch = false, standalone = false, chineseVersion = false }) => {
return { return {
mode: "development", mode: "development",
devtool: "cheap-source-map", devtool: "cheap-source-map",
@ -34,6 +34,7 @@ module.exports = ({ watch = false, standalone = false }) => {
G_TRACKING_ENDPOINT: JSON.stringify( G_TRACKING_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("http://localhost:10005/v1") lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
), ),
G_CHINA_VERSION: JSON.stringify(chineseVersion),
G_IS_DEV: "true", G_IS_DEV: "true",
G_IS_RELEASE: "false", G_IS_RELEASE: "false",
G_IS_MOBILE_APP: "false", G_IS_MOBILE_APP: "false",

@ -16,12 +16,15 @@ module.exports = ({
standalone = false, standalone = false,
isBrowser = true, isBrowser = true,
mobileApp = false, mobileApp = false,
chineseVersion = false,
}) => { }) => {
const globalDefs = { const globalDefs = {
assert: enableAssert ? "window.assert" : "false && window.assert", assert: enableAssert ? "window.assert" : "false && window.assert",
assertAlways: "window.assert", assertAlways: "window.assert",
abstract: "window.assert(false, 'abstract method called');", abstract: "window.assert(false, 'abstract method called');",
G_IS_DEV: "false", G_IS_DEV: "false",
G_CHINA_VERSION: JSON.stringify(chineseVersion),
G_IS_RELEASE: environment === "prod" ? "true" : "false", G_IS_RELEASE: environment === "prod" ? "true" : "false",
G_IS_STANDALONE: standalone ? "true" : "false", G_IS_STANDALONE: standalone ? "true" : "false",
G_IS_BROWSER: isBrowser ? "true" : "false", G_IS_BROWSER: isBrowser ? "true" : "false",

@ -3402,7 +3402,7 @@ cross-spawn@^5.0.1:
shebang-command "^1.2.0" shebang-command "^1.2.0"
which "^1.2.9" which "^1.2.9"
cross-spawn@^7.0.0: cross-spawn@^7.0.0, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@ -4746,6 +4746,21 @@ execa@^4.0.0:
signal-exit "^3.0.2" signal-exit "^3.0.2"
strip-final-newline "^2.0.0" strip-final-newline "^2.0.0"
execa@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376"
integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.0"
human-signals "^2.1.0"
is-stream "^2.0.0"
merge-stream "^2.0.0"
npm-run-path "^4.0.1"
onetime "^5.1.2"
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
executable@^4.1.0: executable@^4.1.0:
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
@ -5517,6 +5532,11 @@ get-stream@^5.0.0, get-stream@^5.1.0:
dependencies: dependencies:
pump "^3.0.0" pump "^3.0.0"
get-stream@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718"
integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==
get-value@^2.0.3, get-value@^2.0.6: get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6" version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@ -5539,6 +5559,16 @@ gifsicle@^5.0.0:
execa "^4.0.0" execa "^4.0.0"
logalot "^2.0.0" logalot "^2.0.0"
gifsicle@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.2.0.tgz#b06b25ed7530f033f6ed2c545d6f9b546cc182fb"
integrity sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==
dependencies:
bin-build "^3.0.0"
bin-wrapper "^4.0.0"
execa "^5.0.0"
logalot "^2.0.0"
glob-all@^3.1.0: glob-all@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
@ -6520,6 +6550,11 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@ -8772,7 +8807,7 @@ npm-run-path@^2.0.0:
dependencies: dependencies:
path-key "^2.0.0" path-key "^2.0.0"
npm-run-path@^4.0.0: npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
@ -8985,6 +9020,13 @@ onetime@^5.1.0:
dependencies: dependencies:
mimic-fn "^2.1.0" mimic-fn "^2.1.0"
onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
open@^0.0.5: open@^0.0.5:
version "0.0.5" version "0.0.5"
resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
@ -11469,6 +11511,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
signal-exit@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-swizzle@^0.2.2: simple-swizzle@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

@ -451,6 +451,10 @@
box-sizing: border-box; box-sizing: border-box;
@include S(grid-gap, 4px); @include S(grid-gap, 4px);
&.china {
grid-template-columns: auto auto 1fr;
}
.author { .author {
flex-grow: 1; flex-grow: 1;
text-align: right; text-align: right;

@ -13,7 +13,7 @@ import { cachebust } from "./cachebust";
const logger = createLogger("background_loader"); const logger = createLogger("background_loader");
const essentialMainMenuSprites = [ const essentialMainMenuSprites = [
"logo.png", G_CHINA_VERSION ? "logo_cn.png" : "logo.png",
...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0), ...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0),
]; ];
const essentialMainMenuSounds = [ const essentialMainMenuSounds = [

@ -19,6 +19,8 @@ declare const G_BUILD_VERSION: string;
declare const G_ALL_UI_IMAGES: Array<string>; declare const G_ALL_UI_IMAGES: Array<string>;
declare const G_IS_RELEASE: boolean; declare const G_IS_RELEASE: boolean;
declare const G_CHINA_VERSION : boolean;
// Polyfills // Polyfills
declare interface String { declare interface String {
replaceAll(search: string, replacement: string): string; replaceAll(search: string, replacement: string): string;

@ -15,7 +15,9 @@ export class AboutState extends TextualGameState {
getMainContentHTML() { getMainContentHTML() {
return ` return `
<div class="head"> <div class="head">
<img src="${cachebust("res/logo.png")}" alt="shapez.io Logo"> <img src="${cachebust(
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
)}" alt="shapez.io Logo">
</div> </div>
<div class="text"> <div class="text">
${T.about.body ${T.about.body

@ -42,7 +42,12 @@ export class MainMenuState extends GameState {
return ` return `
<div class="topButtons"> <div class="topButtons">
<button class="languageChoose" data-languageicon="${this.app.settings.getLanguage()}"></button> ${
G_CHINA_VERSION
? ""
: `<button class="languageChoose" data-languageicon="${this.app.settings.getLanguage()}"></button>`
}
<button class="settingsButton"></button> <button class="settingsButton"></button>
${ ${
G_IS_STANDALONE || G_IS_DEV G_IS_STANDALONE || G_IS_DEV
@ -58,7 +63,9 @@ export class MainMenuState extends GameState {
</video> </video>
<div class="logo"> <div class="logo">
<img src="${cachebust("res/logo.png")}" alt="shapez.io Logo"> <img src="${cachebust(
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
)}" alt="shapez.io Logo">
<span class="updateLabel">v${G_BUILD_VERSION}</span> <span class="updateLabel">v${G_BUILD_VERSION}</span>
</div> </div>
@ -77,11 +84,17 @@ export class MainMenuState extends GameState {
</div> </div>
</div> </div>
<div class="footer"> <div class="footer ${G_CHINA_VERSION ? "china" : ""}">
${
G_CHINA_VERSION
? ""
: `
<a class="githubLink boxLink" target="_blank"> <a class="githubLink boxLink" target="_blank">
${T.mainMenu.openSourceHint} ${T.mainMenu.openSourceHint}
<span class="thirdpartyLogo githubLogo"></span> <span class="thirdpartyLogo githubLogo"></span>
</a> </a>`
}
<a class="discordLink boxLink" target="_blank"> <a class="discordLink boxLink" target="_blank">
${T.mainMenu.discordLink} ${T.mainMenu.discordLink}
@ -89,11 +102,11 @@ export class MainMenuState extends GameState {
</a> </a>
<div class="sidelinks"> <div class="sidelinks">
<a class="redditLink">${T.mainMenu.subreddit}</a> ${G_CHINA_VERSION ? "" : `<a class="redditLink">${T.mainMenu.subreddit}</a>`}
<a class="changelog">${T.changelog.title}</a> ${G_CHINA_VERSION ? "" : `<a class="changelog">${T.changelog.title}</a>`}
<a class="helpTranslate">${T.mainMenu.helpTranslate}</a> ${G_CHINA_VERSION ? "" : `<a class="helpTranslate">${T.mainMenu.helpTranslate}</a>`}
</div> </div>
<div class="author">${T.mainMenu.madeBy.replace( <div class="author">${T.mainMenu.madeBy.replace(
@ -208,10 +221,13 @@ export class MainMenuState extends GameState {
}); });
this.trackClicks(qs(".settingsButton"), this.onSettingsButtonClicked); this.trackClicks(qs(".settingsButton"), this.onSettingsButtonClicked);
this.trackClicks(qs(".changelog"), this.onChangelogClicked);
this.trackClicks(qs(".redditLink"), this.onRedditClicked); if (!G_CHINA_VERSION) {
this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked); this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked);
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked); this.trackClicks(qs(".redditLink"), this.onRedditClicked);
this.trackClicks(qs(".changelog"), this.onChangelogClicked);
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked);
}
if (G_IS_STANDALONE) { if (G_IS_STANDALONE) {
this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked); this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked);
@ -233,11 +249,13 @@ export class MainMenuState extends GameState {
); );
const githubLink = this.htmlElement.querySelector(".githubLink"); const githubLink = this.htmlElement.querySelector(".githubLink");
this.trackClicks( if (githubLink) {
githubLink, this.trackClicks(
() => this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.github), githubLink,
{ preventClick: true } () => this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.github),
); { preventClick: true }
);
}
const producerLink = this.htmlElement.querySelector(".producerLink"); const producerLink = this.htmlElement.querySelector(".producerLink");
this.trackClicks( this.trackClicks(

@ -9,17 +9,19 @@ export class MobileWarningState extends GameState {
getInnerHTML() { getInnerHTML() {
return ` return `
<img class="logo" src="${cachebust("res/logo.png")}" alt="shapez.io Logo"> <img class="logo" src="${cachebust(
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
)}" alt="shapez.io Logo">
<p> <p>
I'm sorry, but shapez.io is not available on mobile devices yet! I'm sorry, but shapez.io is not available on mobile devices yet!
There is also no estimate when this will change, but feel to make a contribution! It's There is also no estimate when this will change, but feel to make a contribution! It's
&nbsp;<a href="https://github.com/tobspr/shapez.io" target="_blank">open source</a>!</p> &nbsp;<a href="https://github.com/tobspr/shapez.io" target="_blank">open source</a>!</p>
<p>If you want to play on your computer, you can also get the standalone on Steam:</p> <p>If you want to play on your computer, you can also get the standalone on Steam:</p>
<a href="${ <a href="${
THIRDPARTY_URLS.standaloneStorePage + "?ref=mobile" THIRDPARTY_URLS.standaloneStorePage + "?ref=mobile"
}" class="standaloneLink" target="_blank">Get the shapez.io standalone!</a> }" class="standaloneLink" target="_blank">Get the shapez.io standalone!</a>

@ -3,7 +3,6 @@ import { cachebust } from "../core/cachebust";
import { globalConfig } from "../core/config"; import { globalConfig } from "../core/config";
import { GameState } from "../core/game_state"; import { GameState } from "../core/game_state";
import { createLogger } from "../core/logging"; import { createLogger } from "../core/logging";
import { findNiceValue } from "../core/utils";
import { getRandomHint } from "../game/hints"; import { getRandomHint } from "../game/hints";
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs"; import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper"; import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
@ -20,7 +19,7 @@ export class PreloadState extends GameState {
return ` return `
<div class="loadingImage"></div> <div class="loadingImage"></div>
<div class="loadingStatus"> <div class="loadingStatus">
<span class="desc">Booting</span> <span class="desc">${G_CHINA_VERSION ? "加载中" : "Booting"}</span>
</div> </div>
</div> </div>
<span class="prefab_GameHint"></span> <span class="prefab_GameHint"></span>
@ -115,6 +114,10 @@ export class PreloadState extends GameState {
.then(() => this.setStatus("Initializing language")) .then(() => this.setStatus("Initializing language"))
.then(() => { .then(() => {
if (G_CHINA_VERSION) {
return this.app.settings.updateLanguage("zh-CN");
}
if (this.app.settings.getLanguage() === "auto-detect") { if (this.app.settings.getLanguage() === "auto-detect") {
const language = autoDetectLanguageId(); const language = autoDetectLanguageId();
logger.log("Setting language to", language); logger.log("Setting language to", language);
@ -163,6 +166,10 @@ export class PreloadState extends GameState {
return; return;
} }
if (G_CHINA_VERSION) {
return;
}
return this.app.storage return this.app.storage
.readFileAsync("lastversion.bin") .readFileAsync("lastversion.bin")
.catch(err => { .catch(err => {
@ -220,6 +227,9 @@ export class PreloadState extends GameState {
} }
update() { update() {
if (G_CHINA_VERSION) {
return;
}
const now = performance.now(); const now = performance.now();
if (now - this.lastHintShown > this.nextHintDuration) { if (now - this.lastHintShown > this.nextHintDuration) {
this.lastHintShown = now; this.lastHintShown = now;
@ -250,6 +260,9 @@ export class PreloadState extends GameState {
*/ */
setStatus(text) { setStatus(text) {
logger.log("✅ " + text); logger.log("✅ " + text);
if (G_CHINA_VERSION) {
return Promise.resolve();
}
this.currentStatus = text; this.currentStatus = text;
this.statusText.innerText = text; this.statusText.innerText = text;
return Promise.resolve(); return Promise.resolve();
@ -265,7 +278,9 @@ export class PreloadState extends GameState {
subElement.innerHTML = ` subElement.innerHTML = `
<div class="logo"> <div class="logo">
<img src="${cachebust("res/logo.png")}" alt="Shapez.io Logo"> <img src="${cachebust(
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
)}" alt="Shapez.io Logo">
</div> </div>
<div class="failureInner"> <div class="failureInner">
<div class="errorHeader"> <div class="errorHeader">

@ -28,8 +28,14 @@ export class SettingsState extends TextualGameState {
} }
<div class="other"> <div class="other">
<button class="styledButton about">${T.about.title}</button>
${
G_CHINA_VERSION
? ""
: `
<button class="styledButton about">${T.about.title}</button>
`
}
<div class="versionbar"> <div class="versionbar">
<div class="buildVersion">${T.global.loading} ...</div> <div class="buildVersion">${T.global.loading} ...</div>
</div> </div>
@ -68,6 +74,10 @@ export class SettingsState extends TextualGameState {
for (let i = 0; i < allApplicationSettings.length; ++i) { for (let i = 0; i < allApplicationSettings.length; ++i) {
const setting = allApplicationSettings[i]; const setting = allApplicationSettings[i];
if (G_CHINA_VERSION && setting.id === "language") {
continue;
}
categoriesHTML[setting.categoryId] += setting.getHtml(this.app); categoriesHTML[setting.categoryId] += setting.getHtml(this.app);
} }
@ -94,9 +104,12 @@ export class SettingsState extends TextualGameState {
onEnter(payload) { onEnter(payload) {
this.renderBuildText(); this.renderBuildText();
this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
preventDefault: false, if (!G_CHINA_VERSION) {
}); this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
preventDefault: false,
});
}
const keybindingsButton = this.htmlElement.querySelector(".editKeybindings"); const keybindingsButton = this.htmlElement.querySelector(".editKeybindings");
@ -131,6 +144,10 @@ export class SettingsState extends TextualGameState {
initSettings() { initSettings() {
allApplicationSettings.forEach(setting => { allApplicationSettings.forEach(setting => {
if (G_CHINA_VERSION && setting.id === "language") {
return;
}
/** @type {HTMLElement} */ /** @type {HTMLElement} */
const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']"); const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
setting.bind(this.app, element, this.dialogs); setting.bind(this.app, element, this.dialogs);

@ -5103,14 +5103,6 @@ levn@^0.4.1:
prelude-ls "^1.2.1" prelude-ls "^1.2.1"
type-check "~0.4.0" type-check "~0.4.0"
line-column@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=
dependencies:
isarray "^1.0.0"
isobject "^2.0.0"
load-bmfont@^1.3.1, load-bmfont@^1.4.0: load-bmfont@^1.3.1, load-bmfont@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
@ -5619,10 +5611,10 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
nanoid@^3.1.12: nanoid@^3.1.20:
version "3.1.12" version "3.1.20"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
nanomatch@^1.2.9: nanomatch@^1.2.9:
version "1.2.13" version "1.2.13"
@ -6927,6 +6919,15 @@ postcss-zindex@^4.0.1:
postcss "^7.0.0" postcss "^7.0.0"
uniqs "^2.0.0" uniqs "^2.0.0"
postcss@>=5.0.0:
version "8.2.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe"
integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg==
dependencies:
colorette "^1.2.1"
nanoid "^3.1.20"
source-map "^0.6.1"
postcss@^5.0.2: postcss@^5.0.2:
version "5.2.18" version "5.2.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
@ -6955,16 +6956,6 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2
source-map "^0.6.1" source-map "^0.6.1"
supports-color "^6.1.0" supports-color "^6.1.0"
postcss@^8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.1.tgz#c3a287dd10e4f6c84cb3791052b96a5d859c9389"
integrity sha512-9DGLSsjooH3kSNjTZUOt2eIj2ZTW0VI2PZ/3My+8TC7KIbH2OKwUlISfDsf63EP4aiRUt3XkEWMWvyJHvJelEg==
dependencies:
colorette "^1.2.1"
line-column "^1.0.2"
nanoid "^3.1.12"
source-map "^0.6.1"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"

Loading…
Cancel
Save