diff --git a/packages/babel-compiler/babel-compiler.js b/packages/babel-compiler/babel-compiler.js index 9824821746..1327083781 100644 --- a/packages/babel-compiler/babel-compiler.js +++ b/packages/babel-compiler/babel-compiler.js @@ -914,8 +914,10 @@ function isExcludedConfig(name, excludeList = [], startsWith) { }); } +const disableTextColors = Boolean(JSON.parse(process.env.METEOR_DISABLE_COLORS || "false")); + function color(text, code) { - return `\x1b[${code}m${text}\x1b[0m`; + return disableTextColors ? text : `\x1b[${code}m${text}\x1b[0m`; } function logTranspilation({ diff --git a/tools/fs/safe-watcher-legacy.ts b/tools/fs/safe-watcher-legacy.ts index f5461f4965..f9f108afc8 100644 --- a/tools/fs/safe-watcher-legacy.ts +++ b/tools/fs/safe-watcher-legacy.ts @@ -405,7 +405,7 @@ function maybeSuggestRaisingWatchLimit(error: Error & { errno: number }) { } export const watch = Profile( - "safeWatcher.watch", + "safeWatcher.watchLegacy", (absPath: string, callback: EntryCallback) => { const entry = acquireWatcher(absPath, callback); return { diff --git a/tools/fs/safe-watcher.ts b/tools/fs/safe-watcher.ts index fbb7d432f2..3e9bda0ab4 100644 --- a/tools/fs/safe-watcher.ts +++ b/tools/fs/safe-watcher.ts @@ -375,17 +375,23 @@ function startNewEntry(absPath: string): Entry { * This registers the callback on the internally managed entry and * ensures that a Parcel watcher is subscribed to a covering directory. */ -export const watch = Profile( - "safeWatcher.watch", +export function watch (absPath: string, callback: ChangeCallback): SafeWatcher { + // @ts-ignore + if (!global.modernWatcher) { + // @ts-ignore + return watchLegacy(absPath, callback); + } + // @ts-ignore + return watchModern(absPath, callback); +}; + +const watchModern = + Profile( + "safeWatcher.watchModern", ( absPath: string, callback: ChangeCallback ): SafeWatcher => { - // @ts-ignore - if (!global.modernWatcher) { - // @ts-ignore - return watchLegacy(absPath, callback); - } absPath = toPosixPath(absPath); // If the path should be ignored, immediately return a noop SafeWatcher. diff --git a/tools/tests/apps/modern/.gitignore b/tools/tests/apps/modern/.gitignore new file mode 100644 index 0000000000..40b878db5b --- /dev/null +++ b/tools/tests/apps/modern/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/tools/tests/apps/modern/.meteor/.finished-upgraders b/tools/tests/apps/modern/.meteor/.finished-upgraders new file mode 100644 index 0000000000..c07b6ff75a --- /dev/null +++ b/tools/tests/apps/modern/.meteor/.finished-upgraders @@ -0,0 +1,19 @@ +# This file contains information which helps Meteor properly upgrade your +# app when you run 'meteor update'. You should check it into version control +# with your project. + +notices-for-0.9.0 +notices-for-0.9.1 +0.9.4-platform-file +notices-for-facebook-graph-api-2 +1.2.0-standard-minifiers-package +1.2.0-meteor-platform-split +1.2.0-cordova-changes +1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.4.0-remove-old-dev-bundle-link +1.4.1-add-shell-server-package +1.4.3-split-account-service-packages +1.5-add-dynamic-import-package +1.7-split-underscore-from-meteor-base +1.8.3-split-jquery-from-blaze diff --git a/tools/tests/apps/modern/.meteor/.gitignore b/tools/tests/apps/modern/.meteor/.gitignore new file mode 100644 index 0000000000..4083037423 --- /dev/null +++ b/tools/tests/apps/modern/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/tools/tests/apps/modern/.meteor/.id b/tools/tests/apps/modern/.meteor/.id new file mode 100644 index 0000000000..b92c6c71e9 --- /dev/null +++ b/tools/tests/apps/modern/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +xh4qomttjyd.znxg6je45aan diff --git a/tools/tests/apps/modern/.meteor/packages b/tools/tests/apps/modern/.meteor/packages new file mode 100644 index 0000000000..341bbfc93a --- /dev/null +++ b/tools/tests/apps/modern/.meteor/packages @@ -0,0 +1,15 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +meteor # Shared foundation for all Meteor packages +static-html # Define static page content in .html files +standard-minifier-css # CSS minifier run for production mode +standard-minifier-js # JS minifier run for production mode +es5-shim # ECMAScript 5 compatibility for older browsers +ecmascript # Enable ECMAScript2015+ syntax in app code +shell-server # Server-side component of the `meteor shell` command +webapp # Serves a Meteor app over HTTP +server-render # Support for server-side rendering diff --git a/tools/tests/apps/modern/.meteor/platforms b/tools/tests/apps/modern/.meteor/platforms new file mode 100644 index 0000000000..efeba1b50c --- /dev/null +++ b/tools/tests/apps/modern/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/tools/tests/apps/modern/.meteor/release b/tools/tests/apps/modern/.meteor/release new file mode 100644 index 0000000000..621e94f0ec --- /dev/null +++ b/tools/tests/apps/modern/.meteor/release @@ -0,0 +1 @@ +none diff --git a/tools/tests/apps/modern/.meteor/versions b/tools/tests/apps/modern/.meteor/versions new file mode 100644 index 0000000000..91b9af05b0 --- /dev/null +++ b/tools/tests/apps/modern/.meteor/versions @@ -0,0 +1,39 @@ +babel-compiler@7.2.4 +babel-runtime@1.3.0 +base64@1.0.11 +blaze-tools@1.0.10 +boilerplate-generator@1.6.0 +caching-compiler@1.2.1 +caching-html-compiler@1.1.3 +dynamic-import@0.5.1 +ecmascript@0.12.4 +ecmascript-runtime@0.7.0 +ecmascript-runtime-client@0.8.0 +ecmascript-runtime-server@0.7.1 +ejson@1.1.0 +es5-shim@4.8.0 +fetch@0.1.0 +html-tools@1.0.11 +htmljs@1.0.11 +inter-process-messaging@0.1.0 +logging@1.1.20 +meteor@1.9.3 +minifier-css@1.4.1 +minifier-js@2.4.0 +modern-browsers@0.1.4-beta181.16 +modules@0.13.0 +modules-runtime@0.10.3 +promise@0.11.2 +random@1.1.0 +routepolicy@1.1.0 +server-render@0.3.1 +shell-server@0.4.0 +spacebars-compiler@1.1.3 +standard-minifier-css@1.5.2 +standard-minifier-js@2.4.0 +static-html@1.2.2 +templating-tools@1.1.2 +tracker@1.2.1 +underscore@1.0.11 +webapp@1.7.3-beta181.16 +webapp-hashing@1.0.9 diff --git a/tools/tests/apps/modern/.swcrc b/tools/tests/apps/modern/.swcrc new file mode 100644 index 0000000000..e859928b67 --- /dev/null +++ b/tools/tests/apps/modern/.swcrc @@ -0,0 +1,8 @@ +{ + "jsc": { + "baseUrl": "./", + "paths": { + "@swcAlias/*": ["swcAlias/*"] + } + } +} diff --git a/tools/tests/apps/modern/client/main.css b/tools/tests/apps/modern/client/main.css new file mode 100644 index 0000000000..7f354f0fa7 --- /dev/null +++ b/tools/tests/apps/modern/client/main.css @@ -0,0 +1,4 @@ +body { + padding: 10px; + font-family: sans-serif; +} diff --git a/tools/tests/apps/modern/client/main.html b/tools/tests/apps/modern/client/main.html new file mode 100644 index 0000000000..19789db4de --- /dev/null +++ b/tools/tests/apps/modern/client/main.html @@ -0,0 +1,21 @@ + + Minimal Meteor app + + + +

Minimal Meteor app

+

+ This Meteor app uses as few Meteor packages as possible, to keep the + client JavaScript bundle as small as possible. +

+ + + +

Learn Meteor!

+ + diff --git a/tools/tests/apps/modern/client/main.js b/tools/tests/apps/modern/client/main.js new file mode 100644 index 0000000000..ce4d5b3750 --- /dev/null +++ b/tools/tests/apps/modern/client/main.js @@ -0,0 +1 @@ +Meteor.startup(() => {}); diff --git a/tools/tests/apps/modern/package-lock.json b/tools/tests/apps/modern/package-lock.json new file mode 100644 index 0000000000..b21affb1c2 --- /dev/null +++ b/tools/tests/apps/modern/package-lock.json @@ -0,0 +1,1119 @@ +{ + "name": "modern", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "meteor-node-stubs": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.9.tgz", + "integrity": "sha512-EKRezc1/PblYtYiK4BOT3h5geWDo9AFBBSYNamPNh8AC5msUbVCcg8kekzAa7r7JPzBX8nZWaXEQVar4t8q/Hg==", + "requires": { + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "domain-browser": "^4.23.0", + "elliptic": "^6.5.4", + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "@meteorjs/crypto-browserify": { + "version": "3.12.1", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "asn1.js": { + "version": "4.10.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "assert": { + "version": "2.1.0", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "bundled": true + }, + "base64-js": { + "version": "1.5.1", + "bundled": true + }, + "bn.js": { + "version": "5.2.0", + "bundled": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "bundled": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "bundled": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.3", + "bundled": true, + "requires": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "bundled": true + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "readable-stream": { + "version": "2.3.8", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "bundled": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.7.1", + "bundled": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "bundled": true + }, + "call-bind": { + "version": "1.0.5", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "bundled": true + }, + "constants-browserify": { + "version": "1.0.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.3", + "bundled": true + }, + "create-ecdh": { + "version": "4.0.4", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "bundled": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "define-data-property": { + "version": "1.1.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-properties": { + "version": "1.2.1", + "bundled": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "des.js": { + "version": "1.0.1", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "domain-browser": { + "version": "4.23.0", + "bundled": true + }, + "elliptic": { + "version": "6.5.5", + "bundled": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "events": { + "version": "3.3.0", + "bundled": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "for-each": { + "version": "0.3.3", + "bundled": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "function-bind": { + "version": "1.1.2", + "bundled": true + }, + "get-intrinsic": { + "version": "1.2.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.3", + "bundled": true + }, + "has-tostringtag": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "bundled": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasown": { + "version": "2.0.0", + "bundled": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "bundled": true + }, + "ieee754": { + "version": "1.2.1", + "bundled": true + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "bundled": true + }, + "is-generator-function": { + "version": "1.0.10", + "bundled": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-typed-array": { + "version": "1.1.12", + "bundled": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true + }, + "object-inspect": { + "version": "1.13.1", + "bundled": true + }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "bundled": true + }, + "object.assign": { + "version": "4.1.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "bundled": true + }, + "pako": { + "version": "1.0.11", + "bundled": true + }, + "parse-asn1": { + "version": "5.1.7", + "bundled": true, + "requires": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "path-browserify": { + "version": "1.0.1", + "bundled": true + }, + "pbkdf2": { + "version": "3.1.2", + "bundled": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "process": { + "version": "0.11.10", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, + "public-encrypt": { + "version": "4.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "qs": { + "version": "6.11.2", + "bundled": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring-es3": { + "version": "0.2.1", + "bundled": true + }, + "randombytes": { + "version": "2.1.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "bundled": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true + }, + "set-function-length": { + "version": "1.1.1", + "bundled": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "bundled": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "side-channel": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "stream-browserify": { + "version": "3.0.0", + "bundled": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.2.0", + "bundled": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "timers-browserify": { + "version": "2.0.12", + "bundled": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tty-browserify": { + "version": "0.0.1", + "bundled": true + }, + "url": { + "version": "0.11.3", + "bundled": true, + "requires": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "util": { + "version": "0.12.5", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "vm-browserify": { + "version": "1.1.2", + "bundled": true + }, + "which-typed-array": { + "version": "1.1.13", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "bundled": true + } + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "requires": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/tools/tests/apps/modern/package.json b/tools/tests/apps/modern/package.json new file mode 100644 index 0000000000..a7fe68949f --- /dev/null +++ b/tools/tests/apps/modern/package.json @@ -0,0 +1,19 @@ +{ + "name": "modern", + "private": true, + "scripts": { + "start": "meteor run" + }, + "dependencies": { + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.12", + "react": "^18.3.1" + }, + "meteor": { + "mainModule": { + "client": "client/main.js", + "server": "server/main.js" + }, + "testModule": "tests/main.js" + } +} diff --git a/tools/tests/apps/modern/server/alias.js b/tools/tests/apps/modern/server/alias.js new file mode 100644 index 0000000000..acf0a92d2a --- /dev/null +++ b/tools/tests/apps/modern/server/alias.js @@ -0,0 +1 @@ +import '@swcAlias/main'; diff --git a/tools/tests/apps/modern/server/custom-component.js b/tools/tests/apps/modern/server/custom-component.js new file mode 100644 index 0000000000..ac52d8c243 --- /dev/null +++ b/tools/tests/apps/modern/server/custom-component.js @@ -0,0 +1,5 @@ +import React from 'react'; + +console.log('custom-component.js'); + +export default <>; diff --git a/tools/tests/apps/modern/server/javascript-component.jsx b/tools/tests/apps/modern/server/javascript-component.jsx new file mode 100644 index 0000000000..6b3976b857 --- /dev/null +++ b/tools/tests/apps/modern/server/javascript-component.jsx @@ -0,0 +1,5 @@ +import React from 'react'; + +console.log('javascript-component.jsx'); + +export default <>; diff --git a/tools/tests/apps/modern/server/javascript.js b/tools/tests/apps/modern/server/javascript.js new file mode 100644 index 0000000000..23fb2816d6 --- /dev/null +++ b/tools/tests/apps/modern/server/javascript.js @@ -0,0 +1,3 @@ +console.log('javascript.js'); + +export default {}; diff --git a/tools/tests/apps/modern/server/main.js b/tools/tests/apps/modern/server/main.js new file mode 100644 index 0000000000..12ffcf4012 --- /dev/null +++ b/tools/tests/apps/modern/server/main.js @@ -0,0 +1,10 @@ +import { Meteor } from "meteor/meteor"; + +Meteor.startup(() => {}); + +try { + const errorStack = new Error().stack; + console.log(errorStack); +} catch (e) { + console.log(e); +} diff --git a/tools/tests/apps/modern/server/typescript-component.tsx b/tools/tests/apps/modern/server/typescript-component.tsx new file mode 100644 index 0000000000..9535cc475d --- /dev/null +++ b/tools/tests/apps/modern/server/typescript-component.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +console.log('typescript-component.tsx'); + +export default <>; diff --git a/tools/tests/apps/modern/server/typescript.ts b/tools/tests/apps/modern/server/typescript.ts new file mode 100644 index 0000000000..05ed0e8932 --- /dev/null +++ b/tools/tests/apps/modern/server/typescript.ts @@ -0,0 +1,3 @@ +console.log('typescript.ts'); + +export default {}; diff --git a/tools/tests/apps/modern/swcAlias/main.js b/tools/tests/apps/modern/swcAlias/main.js new file mode 100644 index 0000000000..65ebe218b3 --- /dev/null +++ b/tools/tests/apps/modern/swcAlias/main.js @@ -0,0 +1 @@ +console.log('swcAlias/main.js alias resolved'); diff --git a/tools/tests/apps/modern/tests/main.js b/tools/tests/apps/modern/tests/main.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/tests/modern.js b/tools/tests/modern.js new file mode 100644 index 0000000000..946215ec84 --- /dev/null +++ b/tools/tests/modern.js @@ -0,0 +1,359 @@ +var selftest = require('../tool-testing/selftest.js'); +var Sandbox = selftest.Sandbox; + +// No need for a high value since the asserts already wait long enough to pass tests +const waitToStart = 5; + +async function writeModernConfig(s, modernConfig) { + const json = JSON.parse(s.read("package.json")); + + json.meteor = { + ...json.meteor, + modern: modernConfig, + }; + + s.write("package.json", JSON.stringify(json, null, 2) + "\n"); + +} + +selftest.define("modern build stack - legacy", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + s.set("METEOR_PROFILE", "0"); + + await writeModernConfig(s, false); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* check legacy stack */ + await run.match(/Babel\.compile/, false, true); + await run.match(/safeWatcher\.watchLegacy/, false, true); + await run.match(/_findSources for web\.browser.legacy/, false, true); + + /* check debug stack */ + await run.match(/server\/main\.js:6:22/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + s.set("METEOR_PROFILE", "0"); + + await writeModernConfig(s, true); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* check modern stack */ + await run.match(/SWC\.compile/, false, true); + await run.match(/safeWatcher\.watchModern/, false, true); + await run.match(/_findSources for web\.browser/, false, true); + + run.forbid(/Babel\.compile/, false, true); + run.forbid(/_findSources for web\.browser\.legacy/, false, true); + + /* check debug stack */ + await run.match(/server\/main\.js:6:22/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - disable transpiler", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + s.set("METEOR_PROFILE", "0"); + + await writeModernConfig(s, { transpiler: false }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* disable transpiler */ + run.forbid(/SWC\.compile/, false, true); + await run.match(/Babel\.compile/, false, true); + + /* Keep rest of modern build stack */ + await run.match(/safeWatcher\.watchModern/, false, true); + await run.match(/_findSources for web\.browser/, false, true); + run.forbid(/_findSources for web\.browser\.legacy/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - disable watcher", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + s.set("METEOR_PROFILE", "0"); + + await writeModernConfig(s, { watcher: false }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* disable watcher */ + run.forbid(/safeWatcher\.watchModern/, false, true); + await run.match(/safeWatcher\.watchLegacy/, false, true); + + /* Keep rest of modern build stack */ + await run.match(/SWC\.compile/, false, true); + await run.match(/_findSources for web\.browser/, false, true); + run.forbid(/_findSources for web\.browser\.legacy/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - disable webArchOnly", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + s.set("METEOR_PROFILE", "0"); + + await writeModernConfig(s, { webArchOnly: false }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* disable webArchOnly */ + await run.match(/_findSources for web\.browser/, false, true); + await run.match(/_findSources for web\.browser\.legacy/, false, true); + + /* Keep rest of modern build stack */ + await run.match(/safeWatcher\.watchModern/, false, true); + await run.match(/SWC\.compile/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - transpiler boolean-like options", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + process.env.METEOR_DISABLE_COLORS = true; + + await writeModernConfig(s, { + transpiler: { + verbose: true, + }, + }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* check transpiler options */ + await run.match(/\[Transpiler] Used SWC.*\(app\)/, false, true); + await run.match(/\[Transpiler] Used SWC.*\(package\)/, false, true); + + await writeModernConfig(s, { + transpiler: { + verbose: true, + excludeApp: true, + }, + }); + await run.match(/\[Transpiler] Used Babel.*\(app\)/, false, true); + + await writeModernConfig(s, { + transpiler: { + verbose: true, + excludePackages: true, + }, + }); + await run.match(/\[Transpiler] Used Babel.*\(package\)/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - transpiler string-like options", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + process.env.METEOR_DISABLE_COLORS = true; + + await writeModernConfig(s, { + transpiler: { + verbose: true, + }, + }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* check transpiler options */ + await run.match(/\[Transpiler] Used SWC.*\(app\)/, false, true); + await run.match(/\[Transpiler] Used SWC.*\(package\)/, false, true); + + await writeModernConfig(s, { + transpiler: { + verbose: true, + excludeApp: ['main.js'], + }, + }); + await run.match(/\[Transpiler] Used Babel.*\(app\)/, false, true); + + await writeModernConfig(s, { + transpiler: { + verbose: true, + excludePackages: ['ejson'], + }, + }); + await run.match(/\[Transpiler] Used Babel.*\(package\)/, false, true); + + await run.stop(); +}); + +async function writConfig(s, config) { + const json = JSON.parse(s.read("package.json")); + + json.meteor = { + ...json.meteor, + ...config, + }; + + s.write("package.json", JSON.stringify(json, null, 2) + "\n"); +} + +async function writeSwcrcConfig(s, config) { + let json = JSON.parse(s.read("package.json")); + json = { + ...json, + ...config, + }; + s.write(".swcrc", JSON.stringify(json, null, 2) + "\n"); +} + +selftest.define("modern build stack - transpiler custom .swcrc", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/alias.js', + }, + }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + /* custom .swcrc and alias resolution */ + await run.match(/alias resolved/, false, true); + + await run.stop(); +}); + +selftest.define("modern build stack - transpiler files", async function () { + const s = new Sandbox(); + await s.init(); + + await s.createApp("modern", "modern"); + await s.cd("modern"); + + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/javascript.js', + }, + }); + + const run = s.run(); + + run.waitSecs(waitToStart); + await run.match("App running at"); + + await run.match(/javascript\.js/, false, true); + + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/javascript-component.jsx', + }, + }); + await run.match(/javascript-component\.jsx/, false, true); + + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/typescript.ts', + }, + }); + await run.match(/typescript\.ts/, false, true); + + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/typescript-component.tsx', + }, + }); + await run.match(/typescript-component\.tsx/, false, true); + + await writeSwcrcConfig(s, { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + jsx: true, + }, + }, + }); + await writConfig(s, { + modern: true, + mainModule: { + client: 'client/main.js', + server: 'server/custom-component.js', + }, + }); + await run.match(/custom-component\.js/, false, true); + + await run.stop(); +}); diff --git a/tools/tool-testing/run.js b/tools/tool-testing/run.js index b15df2db70..3d05b1001d 100644 --- a/tools/tool-testing/run.js +++ b/tools/tool-testing/run.js @@ -184,13 +184,20 @@ export default class Run { // may be a regular expression or a string. Consume stdout up to // that point. If this pattern does not appear after a timeout (or // the program exits before emitting the pattern), fail. - match(pattern, _strict) { + match(pattern, _strict, fullBuffer) { this._ensureStarted(); let timeout = this.baseTimeout + this.extraTime; timeout *= timeoutScaleFactor; this.extraTime = 0; Console.simpleDebug('match', pattern); + if (fullBuffer) { + return this.stdoutMatcher.matchAsync(pattern, { + timeout, + strict: _strict, + matchFullBuffer: fullBuffer, + }); + } return this.stdoutMatcher.match(pattern, timeout, _strict); }