Files
ThreadNet-Web/scripts/pnpm-link.ts
T
Michael TelatynskiandGitHub 4aa1a3549e Enable oxlint restriction ruleset (#34307)
* Remove stale max-len disablements

* Remove stale camelCase & naming-convention disablements

* Remove stale ban-ts-comment disablements

* Remove stale no-var disablements

* Remove stale no-empty-property disablements

* Remove stale react rule disablements

* Remove stale no-constant-condition disablements

* Remove stale no-unused-vars disablements

* Remove stale disablements for disabled rules

* fixup camelcase

* Remove dead code

* Tidy code

* Tweak oxlint config

* Use oxlint to apply jsx/tsx extension consistently

* Fix import

* Fix imports

* Rename affected snapshots

* Update more imports

* Enable restriction ruleset

* Make code comply with new rules

* Make code comply with react/button-has-type

* Make code comply with typescript/non-nullable-type-assertion-style

* Comply with node/no-process-env

* Comply with unicorn/prefer-node-protocol

* Comply with unicorn/import-style

* Comply with unicorn/no-process-exit

* Comply with no-proto

* Comply with node/handle-callback-err

* Comply with import/no-commonjs

* Comply with node/no-path-concat

* Comply with unicorn/no-length-as-slice-end

* Comply with unicorn/no-document-cookie

* Comply with unicorn/prefer-module

* Comply with typescript/prefer-literal-enum-member

* Comply with jsx-a11y/anchor-ambiguous-text

* Tweak oxlint config

* Fix resolves

* Iterate

* Iterate

* Iterate

* Iterate

* Iterate

* Iterate

* Iterate
2026-08-04 09:15:07 +00:00

76 lines
3.2 KiB
JavaScript
Executable File

#!/usr/bin/env node
/*
Copyright 2026 Element Creations Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
// Utility script to mimic yarn classic `link` behaviour
// to enable rapid development of libraries like matrix-js-sdk using symlinks/directory junctions
// reads .link-config file for DEPENDENCY=PATH values and removes those dependencies from node_modules,
// replacing them with a symlink/directory junction.
// This tool is a helpful substitute to `pnpm link` as that modifies the package.json & pnpm-lock.yaml files.
import * as fs from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { execSync } from "node:child_process";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const configPath = path.join(__dirname, "..", ".link-config");
const nodeModulesPath = path.join(__dirname, "..", "node_modules");
try {
if (process.env.PLAYWRIGHT_COMMON_DOCKER) process.exit(0); // Skip in docker env
const configFile = await fs.readFile(configPath, "utf-8");
for (const line of configFile.trim().split("\n")) {
if (!line || line.startsWith("#")) continue;
const [dependency, targetPath, dir] = line.split("=");
const nodeModules = dir ? path.join(dir, "node_modules") : nodeModulesPath;
const dependencyPath = path.join(nodeModules, dependency);
try {
try {
const stat = await fs.lstat(dependencyPath);
console.log(`Existing is ${stat.isSymbolicLink() ? "symlink" : "directory"}`);
if (stat.isSymbolicLink()) {
const linkPath = await fs.readlink(dependencyPath);
if (linkPath === targetPath) {
// already done
continue;
} else {
await fs.unlink(dependencyPath);
}
} else {
await fs.rm(dependencyPath, { recursive: true });
}
} catch (e: any) {
// fs.lstat throws ENOENT if the path doesn't exist (on Windows)
if (e.code === "ENOENT") {
console.log("Received ENOENT error on dependency path - assuming it doesn't exist");
} else {
throw e;
}
}
console.log(`Linking ${dependency} to ${targetPath}`);
await fs.symlink(targetPath, dependencyPath, "junction"); // use a junction type to avoid EPERM errors on Windows
const pkgJson = JSON.parse(await fs.readFile(path.join(targetPath, "package.json"), "utf-8"));
const pkgManager =
pkgJson.devEngines?.packageManager?.name ?? pkgJson.packageManager?.split("@").at(0) ?? "yarn";
// pnpm install may have wiped out the `node_modules` dir so we have to restore it
execSync(`${pkgManager} install --ignore-scripts --frozen-lockfile`, {
cwd: dependencyPath,
});
} catch (e) {
console.error(`Failed to link ${dependency}`, e);
}
}
} catch {
// Ignore config file not existing
}