aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Mk/Uses/electron.mk111
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; \