diff options
| -rw-r--r-- | Mk/Uses/electron.mk | 111 |
1 files changed, 108 insertions, 3 deletions
diff --git a/Mk/Uses/electron.mk b/Mk/Uses/electron.mk index c3efa829d6c3..a764ff2adf8d 100644 --- a/Mk/Uses/electron.mk +++ b/Mk/Uses/electron.mk @@ -474,6 +474,9 @@ DISTFILES+= ${_DISTFILE_prefetch}:prefetch FETCH_DEPENDS+= ${_NPM_PKGNAME}>0:${_NPM_PORTDIR} . elif ${_NODEJS_NPM} == pnpm FETCH_DEPENDS+= ${JQ_CMD}:textproc/jq +. if ${NPM_VER:R:R} >= 11 +FETCH_DEPENDS+= sqlite3:databases/sqlite3 +. endif . endif electron-fetch-node-modules: @@ -493,7 +496,7 @@ electron-fetch-node-modules: electron-archive-node-modules: . if ${_NODEJS_NPM} == npm - @if [ -d ${WRKDIR}/node-modules-cache ]; then \ + @if [ ! -f ${DISTDIR}/${DIST_SUBDIR}/${_DISTFILE_prefetch} ] && [ -d ${WRKDIR}/node-modules-cache ]; then \ ${ECHO_MSG} "===> Archiving prefetched node modules"; \ for dir in `${FIND} -s ${WRKDIR}/node-modules-cache -type d -name ${NPM_MODULE_CACHE} -print | \ ${GREP} -ve '${NPM_MODULE_CACHE}/.*/${NPM_MODULE_CACHE}'`; do \ @@ -511,7 +514,95 @@ electron-archive-node-modules: fi . elif ${_NODEJS_NPM:Myarn*} || ${_NODEJS_NPM} == pnpm . if ${_NODEJS_NPM} == pnpm - @if [ -d ${WRKDIR}/node-modules-cache ]; then \ +. if ${NPM_VER:R:R} >= 11 + @if [ ! -f ${DISTDIR}/${DIST_SUBDIR}/${_DISTFILE_prefetch} ] && [ -d ${WRKDIR}/node-modules-cache ]; then \ + ${ECHO_MSG} "===> Normalizing timestamps and permissions of prefetched node modules"; \ + tmpdir=${WRKDIR}/pnpm_tmp; \ + input_db=${WRKDIR}/node-modules-cache/${NPM_MODULE_CACHE}/v11/index.db; \ + output_db=$${tmpdir}/index.db; \ + output_db_dump=${WRKDIR}/node-modules-cache/${NPM_MODULE_CACHE}/v11/index_dump.sql; \ + ${MKDIR} $${tmpdir}; \ + cd $${tmpdir} && ${SETENV} ${MAKE_ENV} ${NPM_CMDNAME} add --ignore-scripts --silent msgpackr; \ + sqlite3 $${input_db} \ + "SELECT writefile('$${tmpdir}/' || row_number() OVER (ORDER BY key ASC) || '.msgpack', data) FROM package_index;" > /dev/null; \ + sqlite3 $${input_db} \ + "SELECT key FROM package_index ORDER BY key ASC;" > $${tmpdir}/keys_list.txt; \ + counter=1; \ + while IFS= read -r key; do \ + ${PRINTF} "%s" "$${key}" > $${tmpdir}/$${counter}.key; \ + counter=$$((counter + 1)); \ + done < $${tmpdir}/keys_list.txt; \ + for file in $${tmpdir}/*.msgpack; do \ + base=$${file%.msgpack}; \ + node -e " \ + const fs = require('fs'); \ + const { Unpackr } = require('msgpackr'); \ + const unpackr = new Unpackr({}); \ + const buf = fs.readFileSync(0); \ + const data = unpackr.unpack(buf); \ + console.log(JSON.stringify(data, (key, value) => { \ + if (value instanceof Map) { \ + return { __type: 'Map', data: Array.from(value.entries()) }; \ + } \ + return value; \ + })); \ + " < $${file} > $${base}.msgpack.json; \ + ${JQ_CMD} -S ' \ + walk( \ + if type == "object" then \ + if has("checkedAt") then .checkedAt = 0 else . end | \ + if has("mode") then \ + if (.mode / 16 | floor) % 2 == 1 then .mode = .mode - 16 else . end \ + else \ + . \ + end \ + else \ + . \ + end \ + ) \ + ' $${base}.msgpack.json > $${base}.normalized.json; \ + node -e " \ + const fs = require('fs'); \ + const { Packr } = require('msgpackr'); \ + const packr = new Packr({ structuredClone: true }); \ + const rawJson = JSON.parse(fs.readFileSync(0, 'utf-8')); \ + const restoreMaps = (obj) => { \ + if (obj && typeof obj === 'object') { \ + if (obj.__type === 'Map') { \ + return new Map(obj.data.map(([k, v]) => [k, restoreMaps(v)])); \ + } \ + for (let k in obj) { \ + obj[k] = restoreMaps(obj[k]); \ + } \ + } \ + return obj; \ + }; \ + const restoredData = restoreMaps(rawJson); \ + process.stdout.write(packr.pack(restoredData)); \ + " < $${base}.normalized.json > $${base}.normalized.msgpack; \ + done; \ + sqlite3 $${output_db} \ + "CREATE TABLE package_index (key TEXT PRIMARY KEY, data BLOB) WITHOUT ROWID;" > /dev/null 2>&1; \ + sqlite3 $${output_db} \ + "PRAGMA page_size = 4096; PRAGMA journal_mode = DELETE; PRAGMA auto_vacuum = NONE; PRAGMA secure_delete = ON;" > /dev/null 2>&1; \ + total_files=$$((counter - 1)); \ + i=1; \ + while [ $${i} -le $${total_files} ]; do \ + real_key=`${CAT} $${tmpdir}/$${i}.key`; \ + { \ + ${PRINTF} "INSERT INTO package_index (key, data) VALUES ('%s', x'" "$${real_key}"; \ + hexdump -v -e '/1 "%02x"' $${tmpdir}/$${i}.normalized.msgpack; \ + ${PRINTF} "');\n"; \ + } | sqlite3 $${output_db}; \ + i=$$((i + 1)); \ + done; \ + sqlite3 $${output_db} "REINDEX; VACUUM;"; \ + sqlite3 $${output_db} ".dump" > $${output_db_dump}; \ + ${RM} $${input_db}; \ + fi +. else + @if [ ! -f ${DISTDIR}/${DIST_SUBDIR}/${_DISTFILE_prefetch} ] && [ -d ${WRKDIR}/node-modules-cache ]; then \ + ${ECHO_MSG} "===> Normalizing timestamps and permissions of prefetched node modules"; \ ${FIND} ${WRKDIR}/node-modules-cache/${NPM_MODULE_CACHE} \ -type f -name '*.json' -exec ${SH} -c ' \ for f do \ @@ -522,8 +613,9 @@ electron-archive-node-modules: ${RM} -r ${WRKDIR}/node-modules-cache/${NPM_MODULE_CACHE}/*/$${dir}; \ done; \ fi +. endif . endif - @if [ -d ${WRKDIR}/node-modules-cache ]; then \ + @if [ ! -f ${DISTDIR}/${DIST_SUBDIR}/${_DISTFILE_prefetch} ] && [ -d ${WRKDIR}/node-modules-cache ]; then \ ${ECHO_MSG} "===> Archiving prefetched node modules"; \ cd ${WRKDIR}/node-modules-cache && \ ${SETENV} SCRIPTSDIR=${SCRIPTSDIR} WRKDIR=${WRKDIR} \ @@ -551,6 +643,12 @@ EXTRACT_DEPENDS+= ${_NPM_PKGNAME}>0:${_NPM_PORTDIR} . elif ${_NODEJS_NPM} == yarn2 || ${_NODEJS_NPM} == yarn4 || ${_NODEJS_NPM} == pnpm EXTRACT_DEPENDS+= ${_NODEJS_PKGNAME}>0:${_NODEJS_PORT} . endif +. if ${_NODEJS_NPM} == pnpm && ${NPM_VER:R:R} >= 11 +EXTRACT_DEPENDS+= sqlite3:databases/sqlite3 +. if ${NPM_VER:R} >= 11.3 +NPM_EXTRACT_FLAGS+= --trust-lockfile +. endif +. endif electron-extract-node-package-manager: . if ${_NODEJS_NPM} == yarn2 || ${_NODEJS_NPM} == yarn4 || ${_NODEJS_NPM} == pnpm @@ -605,6 +703,13 @@ electron-install-node-modules: fi . elif ${_NODEJS_NPM} == pnpm @${ECHO_MSG} "===> Installing node modules from prefetched cache" +. if ${NPM_VER:R:R} >= 11 + @if [ -d ${EXTRACT_WRKDIR}/${NPM_MODULE_CACHE} ]; then \ + normalized_db_dump=${EXTRACT_WRKDIR}/${NPM_MODULE_CACHE}/v11/index_dump.sql; \ + index_db=${EXTRACT_WRKDIR}/${NPM_MODULE_CACHE}/v11/index.db; \ + sqlite3 $${index_db} < $${normalized_db_dump}; \ + fi +. endif @if [ -d ${EXTRACT_WRKDIR}/${NPM_MODULE_CACHE} ]; then \ ${MKDIR} ${WRKDIR}/node-modules-cache; \ ${MV} ${EXTRACT_WRKDIR}/${NPM_MODULE_CACHE} ${WRKDIR}/node-modules-cache; \ |
