querysub 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dependency-cruiser.js +304 -0
- package/.eslintrc.js +51 -0
- package/.github/copilot-instructions.md +1 -0
- package/.vscode/settings.json +25 -0
- package/bin/deploy.js +4 -0
- package/bin/function.js +4 -0
- package/bin/server.js +4 -0
- package/costsBenefits.txt +112 -0
- package/deploy.ts +3 -0
- package/inject.ts +1 -0
- package/package.json +60 -0
- package/prompts.txt +54 -0
- package/spec.txt +820 -0
- package/src/-a-archives/archiveCache.ts +913 -0
- package/src/-a-archives/archives.ts +148 -0
- package/src/-a-archives/archivesBackBlaze.ts +792 -0
- package/src/-a-archives/archivesDisk.ts +418 -0
- package/src/-a-archives/copyLocalToBackblaze.ts +24 -0
- package/src/-a-auth/certs.ts +517 -0
- package/src/-a-auth/der.ts +122 -0
- package/src/-a-auth/ed25519.ts +1015 -0
- package/src/-a-auth/node-forge-ed25519.d.ts +17 -0
- package/src/-b-authorities/dnsAuthority.ts +203 -0
- package/src/-b-authorities/emailAuthority.ts +57 -0
- package/src/-c-identity/IdentityController.ts +200 -0
- package/src/-d-trust/NetworkTrust2.ts +150 -0
- package/src/-e-certs/EdgeCertController.ts +288 -0
- package/src/-e-certs/certAuthority.ts +192 -0
- package/src/-f-node-discovery/NodeDiscovery.ts +543 -0
- package/src/-g-core-values/NodeCapabilities.ts +134 -0
- package/src/-g-core-values/oneTimeForward.ts +91 -0
- package/src/-h-path-value-serialize/PathValueSerializer.ts +769 -0
- package/src/-h-path-value-serialize/stringSerializer.ts +176 -0
- package/src/0-path-value-core/LoggingClient.tsx +24 -0
- package/src/0-path-value-core/NodePathAuthorities.ts +978 -0
- package/src/0-path-value-core/PathController.ts +1 -0
- package/src/0-path-value-core/PathValueCommitter.ts +565 -0
- package/src/0-path-value-core/PathValueController.ts +231 -0
- package/src/0-path-value-core/archiveLocks/ArchiveLocks.ts +154 -0
- package/src/0-path-value-core/archiveLocks/ArchiveLocks2.ts +820 -0
- package/src/0-path-value-core/archiveLocks/archiveSnapshots.ts +180 -0
- package/src/0-path-value-core/debugLogs.ts +90 -0
- package/src/0-path-value-core/pathValueArchives.ts +483 -0
- package/src/0-path-value-core/pathValueCore.ts +2217 -0
- package/src/1-path-client/RemoteWatcher.ts +558 -0
- package/src/1-path-client/pathValueClientWatcher.ts +702 -0
- package/src/2-proxy/PathValueProxyWatcher.ts +1857 -0
- package/src/2-proxy/archiveMoveHarness.ts +376 -0
- package/src/2-proxy/garbageCollection.ts +753 -0
- package/src/2-proxy/pathDatabaseProxyBase.ts +37 -0
- package/src/2-proxy/pathValueProxy.ts +139 -0
- package/src/2-proxy/schema2.ts +518 -0
- package/src/3-path-functions/PathFunctionHelpers.ts +129 -0
- package/src/3-path-functions/PathFunctionRunner.ts +619 -0
- package/src/3-path-functions/PathFunctionRunnerMain.ts +67 -0
- package/src/3-path-functions/deployBlock.ts +10 -0
- package/src/3-path-functions/deployCheck.ts +7 -0
- package/src/3-path-functions/deployMain.ts +160 -0
- package/src/3-path-functions/pathFunctionLoader.ts +282 -0
- package/src/3-path-functions/syncSchema.ts +475 -0
- package/src/3-path-functions/tests/functionsTest.ts +135 -0
- package/src/3-path-functions/tests/rejectTest.ts +77 -0
- package/src/4-dom/css.tsx +29 -0
- package/src/4-dom/cssTypes.d.ts +212 -0
- package/src/4-dom/qreact.tsx +2322 -0
- package/src/4-dom/qreactTest.tsx +417 -0
- package/src/4-querysub/Querysub.ts +877 -0
- package/src/4-querysub/QuerysubController.ts +620 -0
- package/src/4-querysub/copyEvent.ts +0 -0
- package/src/4-querysub/permissions.ts +289 -0
- package/src/4-querysub/permissionsShared.ts +1 -0
- package/src/4-querysub/querysubPrediction.ts +525 -0
- package/src/5-diagnostics/FullscreenModal.tsx +67 -0
- package/src/5-diagnostics/GenericFormat.tsx +165 -0
- package/src/5-diagnostics/Modal.tsx +79 -0
- package/src/5-diagnostics/Table.tsx +183 -0
- package/src/5-diagnostics/TimeGrouper.tsx +114 -0
- package/src/5-diagnostics/diskValueAudit.ts +216 -0
- package/src/5-diagnostics/memoryValueAudit.ts +442 -0
- package/src/5-diagnostics/nodeMetadata.ts +135 -0
- package/src/5-diagnostics/qreactDebug.tsx +309 -0
- package/src/5-diagnostics/shared.ts +26 -0
- package/src/5-diagnostics/synchronousLagTracking.ts +47 -0
- package/src/TestController.ts +35 -0
- package/src/allowclient.flag +0 -0
- package/src/bits.ts +86 -0
- package/src/buffers.ts +69 -0
- package/src/config.ts +53 -0
- package/src/config2.ts +48 -0
- package/src/diagnostics/ActionsHistory.ts +56 -0
- package/src/diagnostics/NodeViewer.tsx +503 -0
- package/src/diagnostics/SizeLimiter.ts +62 -0
- package/src/diagnostics/TimeDebug.tsx +18 -0
- package/src/diagnostics/benchmark.ts +139 -0
- package/src/diagnostics/errorLogs/ErrorLogController.ts +515 -0
- package/src/diagnostics/errorLogs/ErrorLogCore.ts +274 -0
- package/src/diagnostics/errorLogs/LogClassifiers.tsx +302 -0
- package/src/diagnostics/errorLogs/LogFilterUI.tsx +84 -0
- package/src/diagnostics/errorLogs/LogNotify.tsx +101 -0
- package/src/diagnostics/errorLogs/LogTimeSelector.tsx +724 -0
- package/src/diagnostics/errorLogs/LogViewer.tsx +757 -0
- package/src/diagnostics/errorLogs/hookErrors.ts +60 -0
- package/src/diagnostics/errorLogs/logFiltering.tsx +149 -0
- package/src/diagnostics/heapTag.ts +13 -0
- package/src/diagnostics/listenOnDebugger.ts +77 -0
- package/src/diagnostics/logs/DiskLoggerPage.tsx +572 -0
- package/src/diagnostics/logs/ObjectDisplay.tsx +165 -0
- package/src/diagnostics/logs/ansiFormat.ts +108 -0
- package/src/diagnostics/logs/diskLogGlobalContext.ts +38 -0
- package/src/diagnostics/logs/diskLogger.ts +305 -0
- package/src/diagnostics/logs/diskShimConsoleLogs.ts +32 -0
- package/src/diagnostics/logs/injectFileLocationToConsole.ts +50 -0
- package/src/diagnostics/logs/logGitHashes.ts +30 -0
- package/src/diagnostics/managementPages.tsx +289 -0
- package/src/diagnostics/periodic.ts +89 -0
- package/src/diagnostics/runSaturationTest.ts +416 -0
- package/src/diagnostics/satSchema.ts +64 -0
- package/src/diagnostics/trackResources.ts +82 -0
- package/src/diagnostics/watchdog.ts +55 -0
- package/src/errors.ts +132 -0
- package/src/forceProduction.ts +3 -0
- package/src/fs.ts +72 -0
- package/src/heapDumps.ts +666 -0
- package/src/https.ts +2 -0
- package/src/inject.ts +1 -0
- package/src/library-components/ATag.tsx +84 -0
- package/src/library-components/Button.tsx +344 -0
- package/src/library-components/ButtonSelector.tsx +64 -0
- package/src/library-components/DropdownCustom.tsx +151 -0
- package/src/library-components/DropdownSelector.tsx +32 -0
- package/src/library-components/Input.tsx +334 -0
- package/src/library-components/InputLabel.tsx +198 -0
- package/src/library-components/InputPicker.tsx +125 -0
- package/src/library-components/LazyComponent.tsx +62 -0
- package/src/library-components/MeasureHeightCSS.tsx +48 -0
- package/src/library-components/MeasuredDiv.tsx +47 -0
- package/src/library-components/ShowMore.tsx +51 -0
- package/src/library-components/SyncedController.ts +171 -0
- package/src/library-components/TimeRangeSelector.tsx +407 -0
- package/src/library-components/URLParam.ts +263 -0
- package/src/library-components/colors.tsx +14 -0
- package/src/library-components/drag.ts +114 -0
- package/src/library-components/icons.tsx +692 -0
- package/src/library-components/niceStringify.ts +50 -0
- package/src/library-components/renderToString.ts +52 -0
- package/src/misc/PromiseRace.ts +101 -0
- package/src/misc/color.ts +30 -0
- package/src/misc/getParentProcessId.cs +53 -0
- package/src/misc/getParentProcessId.ts +53 -0
- package/src/misc/hash.ts +83 -0
- package/src/misc/ipPong.js +13 -0
- package/src/misc/networking.ts +2 -0
- package/src/misc/random.ts +45 -0
- package/src/misc.ts +19 -0
- package/src/noserverhotreload.flag +0 -0
- package/src/path.ts +226 -0
- package/src/persistentLocalStore.ts +37 -0
- package/src/promise.ts +15 -0
- package/src/server.ts +73 -0
- package/src/src.d.ts +1 -0
- package/src/test/heapProcess.ts +36 -0
- package/src/test/mongoSatTest.tsx +55 -0
- package/src/test/satTest.ts +193 -0
- package/src/test/test.tsx +552 -0
- package/src/zip.ts +92 -0
- package/src/zipThreaded.ts +106 -0
- package/src/zipThreadedWorker.js +19 -0
- package/tsconfig.json +27 -0
- package/yarnSpec.txt +56 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { lazy } from "socket-function/src/caching";
|
|
2
|
+
import os from "os";
|
|
3
|
+
import { Worker } from "worker_threads";
|
|
4
|
+
import { isNode } from "typesafecss";
|
|
5
|
+
import { PromiseObj } from "./promise";
|
|
6
|
+
import debugbreak from "debugbreak";
|
|
7
|
+
import { asBuffer } from "./buffers";
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
let getWorkerLimit = lazy(() => {
|
|
11
|
+
// Half the CPUs should be enough
|
|
12
|
+
return Math.max(1, Math.floor(os.cpus().length / 2));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
interface UnzipWorker {
|
|
16
|
+
queueDepth: number;
|
|
17
|
+
unzip(buffer: Buffer): Promise<Buffer>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let sharedBufferPool: {
|
|
21
|
+
buffer: SharedArrayBuffer;
|
|
22
|
+
}[] = [];
|
|
23
|
+
function getSharedBuffer(size: number): SharedArrayBuffer {
|
|
24
|
+
let index = sharedBufferPool.findIndex(buffer => buffer.buffer.byteLength >= size);
|
|
25
|
+
if (index >= 0) {
|
|
26
|
+
let bufferObj = sharedBufferPool.splice(index, 1)[0];
|
|
27
|
+
return bufferObj.buffer;
|
|
28
|
+
}
|
|
29
|
+
// Round to power of 2, so it will be reused
|
|
30
|
+
//size = Math.pow(2, Math.ceil(Math.log2(size)));
|
|
31
|
+
return new SharedArrayBuffer(size);
|
|
32
|
+
}
|
|
33
|
+
function releaseSharedBuffer(buffer: SharedArrayBuffer) {
|
|
34
|
+
sharedBufferPool.push({ buffer });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let unzipWorkers: UnzipWorker[] = [];
|
|
38
|
+
async function spawnWorker() {
|
|
39
|
+
if (!isNode()) throw new Error("Parallel unzipping is support in Node.js at the moment");
|
|
40
|
+
const worker = new Worker(__dirname + "/zipThreadedWorker.js");
|
|
41
|
+
let workerObj: UnzipWorker = {
|
|
42
|
+
queueDepth: 0,
|
|
43
|
+
unzip
|
|
44
|
+
};
|
|
45
|
+
let messageQueue: {
|
|
46
|
+
onFree: () => void;
|
|
47
|
+
promise: PromiseObj<Buffer>;
|
|
48
|
+
}[] = [];
|
|
49
|
+
worker.on("message", (buffer: Uint8Array | { error: string }) => {
|
|
50
|
+
if ("error" in buffer) {
|
|
51
|
+
let { promise, onFree } = messageQueue.shift()!;
|
|
52
|
+
onFree();
|
|
53
|
+
workerObj.queueDepth = messageQueue.length;
|
|
54
|
+
console.log(`Error inside worker: ${buffer.error}`);
|
|
55
|
+
promise.reject(new Error(buffer.error));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
let { promise, onFree } = messageQueue.shift()!;
|
|
59
|
+
onFree();
|
|
60
|
+
workerObj.queueDepth = messageQueue.length;
|
|
61
|
+
promise.resolve(asBuffer(buffer));
|
|
62
|
+
});
|
|
63
|
+
worker.on("error", (err) => {
|
|
64
|
+
let { promise, onFree } = messageQueue.shift()!;
|
|
65
|
+
onFree();
|
|
66
|
+
workerObj.queueDepth = messageQueue.length;
|
|
67
|
+
console.log(`Worker error: ${err.message}`);
|
|
68
|
+
promise.reject(err);
|
|
69
|
+
});
|
|
70
|
+
async function unzip(buffer: Buffer): Promise<Buffer> {
|
|
71
|
+
let promise = new PromiseObj<Buffer>();
|
|
72
|
+
let sharedBuffer = getSharedBuffer(buffer.length);
|
|
73
|
+
{
|
|
74
|
+
let view = Buffer.from(sharedBuffer, 0, buffer.length);
|
|
75
|
+
view.set(buffer);
|
|
76
|
+
buffer = view;
|
|
77
|
+
}
|
|
78
|
+
messageQueue.push({
|
|
79
|
+
promise,
|
|
80
|
+
onFree() {
|
|
81
|
+
releaseSharedBuffer(sharedBuffer);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
workerObj.queueDepth = messageQueue.length;
|
|
85
|
+
worker.postMessage(buffer);
|
|
86
|
+
return await promise.promise;
|
|
87
|
+
}
|
|
88
|
+
unzipWorkers.push(workerObj);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function unzipThreaded(buffer: Buffer): Promise<Buffer> {
|
|
92
|
+
let worker = unzipWorkers.find(worker => worker.queueDepth === 0);
|
|
93
|
+
if (!worker && unzipWorkers.length < getWorkerLimit()) {
|
|
94
|
+
await spawnWorker();
|
|
95
|
+
worker = unzipWorkers.find(worker => worker.queueDepth === 0);
|
|
96
|
+
}
|
|
97
|
+
if (!worker) {
|
|
98
|
+
// Use the most free worker
|
|
99
|
+
let minQueueDepth = Math.min(...unzipWorkers.map(worker => worker.queueDepth));
|
|
100
|
+
worker = unzipWorkers.find(worker => worker.queueDepth === minQueueDepth);
|
|
101
|
+
}
|
|
102
|
+
if (!worker) {
|
|
103
|
+
throw new Error("Impossible, no workers?");
|
|
104
|
+
}
|
|
105
|
+
return worker.unzip(buffer);
|
|
106
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const { parentPort } = require("worker_threads");
|
|
2
|
+
const zlib = require("zlib");
|
|
3
|
+
const parentPortConst = parentPort;
|
|
4
|
+
if (!parentPortConst) {
|
|
5
|
+
throw new Error("This file must be run as a worker thread");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
parentPortConst.on("message", (buffer) => {
|
|
9
|
+
// A synced call is important, as it keeps calls in order
|
|
10
|
+
try {
|
|
11
|
+
let unzipped = zlib.unzipSync(buffer);
|
|
12
|
+
let sharedBuffer = new SharedArrayBuffer(unzipped.length);
|
|
13
|
+
let sharedArray = new Uint8Array(sharedBuffer);
|
|
14
|
+
sharedArray.set(unzipped);
|
|
15
|
+
parentPortConst.postMessage(sharedArray);
|
|
16
|
+
} catch (err) {
|
|
17
|
+
parentPortConst.postMessage({ error: err.message });
|
|
18
|
+
}
|
|
19
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"strict": true,
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"esModuleInterop": true,
|
|
6
|
+
"allowSyntheticDefaultImports": true,
|
|
7
|
+
"moduleResolution": "node",
|
|
8
|
+
"target": "es2018",
|
|
9
|
+
"lib": [
|
|
10
|
+
"ESNext",
|
|
11
|
+
"dom",
|
|
12
|
+
"dom.iterable"
|
|
13
|
+
],
|
|
14
|
+
"jsx": "react",
|
|
15
|
+
"alwaysStrict": true,
|
|
16
|
+
"jsxFactory": "qreact.createElement",
|
|
17
|
+
"jsxFragmentFactory": "qreact.Fragment",
|
|
18
|
+
"types": [
|
|
19
|
+
"node",
|
|
20
|
+
],
|
|
21
|
+
"experimentalDecorators": true,
|
|
22
|
+
"emitDecoratorMetadata": false,
|
|
23
|
+
"skipLibCheck": true,
|
|
24
|
+
"inlineSourceMap": true,
|
|
25
|
+
"inlineSources": true,
|
|
26
|
+
}
|
|
27
|
+
}
|
package/yarnSpec.txt
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
- better yarn, `packagedownload`?
|
|
2
|
+
|
|
3
|
+
ACTUALLY, a lot of this, BUT, have the config format just entirely describe the on disk format, being relative to where each package is located. That way it is obvious how you will change how a specific package resolves just inside of another package, or if one package is using a custom version, etc, etc.
|
|
4
|
+
|
|
5
|
+
`npm -run packagedownload add package-name`, `npm -run packagedownload install`
|
|
6
|
+
add
|
|
7
|
+
--dry-run
|
|
8
|
+
--force
|
|
9
|
+
--update
|
|
10
|
+
--dev
|
|
11
|
+
--nolink
|
|
12
|
+
install
|
|
13
|
+
--dry-run
|
|
14
|
+
--force
|
|
15
|
+
--update
|
|
16
|
+
--nolink
|
|
17
|
+
- DON'T run scripts by default, only running them if requested via `"execute": {}` in the package.json configuration
|
|
18
|
+
- With a "request-execute" field, which warns if you use a package and don't let it execute (it will still run it though)
|
|
19
|
+
- On install performs a "light" check, only checking the "package.json".version of packages (or package, if a package is specified), not updating anything that looks up to date
|
|
20
|
+
- Has a --force flag, which will always delete all packages and install a new one (or rather, install all packages, as we will always delete and install the new one when we are installing)
|
|
21
|
+
- Still supports a --production mode, which doesn't install dev dependencies
|
|
22
|
+
- HAS to support "cpu", and "os" restrictions
|
|
23
|
+
- But, still support "ignore-engines", to skip these
|
|
24
|
+
- ALWAYS flat, warning on conflicts, using package "resolutions" to decide which one to use
|
|
25
|
+
- Although, maybe we can have "sandbox", which allows certain dependencies to be told to install all of their dependencies as nested? We won't be able to do partial sandboxing, unless the package is a few levels deep, and we pick the package directly above it (which doesn't give us full control, but is probably enough).
|
|
26
|
+
- Call the lock file `resolvedversions.json`, as it isn't for locking, it is for specifying which versions of packages should be used (if compatible with the rough version in package.json)
|
|
27
|
+
- Avoid nesting automatically, by having any install check if the current folder is in a node_modules folder, and if so uses the lock file above that, and installs the dependencies as siblings in that node_modules folder
|
|
28
|
+
- Allow packages to use `{ "force-sandbox": true }`, to force their dependencies to be installed in a nested node_modules (sandboxing which also cause the child yarn.lock to be checked before the parent yarn.lock)
|
|
29
|
+
- Greatly simplified lock file, given that we generally won't have nested dependencies
|
|
30
|
+
- The lock file can give more metadata, such as the full chain of dependencies to the root package.json dependency, as well as package sizes and file counts
|
|
31
|
+
- Marks which dependencies are dev only (or only included because of a dev only dependency)
|
|
32
|
+
- Support for "link" inside of the package json, which instead works like: `{ "local": { "shard": "../shard/" } }`, which uses those paths when they exist
|
|
33
|
+
- A "nolink" option will disable this
|
|
34
|
+
- Creates symlinks
|
|
35
|
+
- Makes symlinks for all nested dependencies as well
|
|
36
|
+
- Adds metadata in the lock file to indicate the modules are being symlinked?
|
|
37
|
+
- Ability to install only a specific package, aka, `install shard`, which uses the version in the lock file (or package.json)
|
|
38
|
+
- typenode can start installing on require, only installing the required package
|
|
39
|
+
- There would have to be a way to turn it off, ex, with `typenodecompat`, which wouldn't install packages. That way you could use typenode without messing up your node_modules folders
|
|
40
|
+
- This mode could also store the dist folders somewhere else, or even... just not store them, eliminating caching?
|
|
41
|
+
- We could even use packagedownload via an import, so we don't need to spawn a new processes!
|
|
42
|
+
- This would allow packagedownload to maintain various caches, making it a lot more efficient when called multiple times.
|
|
43
|
+
- Add a TODO to support some form of tree-shaking. As in, if we detect out of the module only "x" and "y" are included, then we can strip the file of everything unrelated to "x" and "y" (which is not easy, but... not REALLY hard either). The idea, is not to reduce file size (who cares about that?), but actually to create unused requires, which we can then strip as well!
|
|
44
|
+
- We would need a flag to know if required modules have side-effects or not (package.json has a flag for this, and we can also support a `module.sideeffects = true` flag)
|
|
45
|
+
- And, we might as well have a package.json flag to set side-effects on nested packages, probably recursively.
|
|
46
|
+
- If the package is marked with "execute" it will be recursively installed as well, unless it has "no-recursive" in the package.json
|
|
47
|
+
- Can be added to a package directly, which ADDS A BOOTSTRAPPER, by default, as a .js file, and adds a reference to a new scripts step ("packagedownload.js"?), or some similar step, in package.json. It can then be also called in your runs steps, ex, `node ./packagedownload.js && npm -run typenode ./index.ts`, which then allows `npm -run start` to work after an install (heck, you could even do `git clone git@github.com/user/repo.git ~/repo && cd ~/repo && git -run start`, to easily install it on any system that just has node and git)
|
|
48
|
+
- Eventually we could add the ability to install node, using the node version from the package.json (using the upper limit, ex `>=11 <15`, would use node 15), which would mean basically any system could use it.
|
|
49
|
+
- Maybe use a global package download cache (which is maintained and kept below a certain percent of available space!)
|
|
50
|
+
- `--update-check` and `--update`, to deal with updating yarn.lock (-check just checks and logs potential updates)
|
|
51
|
+
- ALSO, "sources", which can be used to map packages to servers other than npm! Ex, github, etc. BUT, unlike the other way of doing it, versions are still supported!
|
|
52
|
+
- `{ "sources": { "source-map-support": "https://github.com/user/source-map-support" } }`
|
|
53
|
+
- Also supports npm, so you can switch out a package (for your dependencies too), easily
|
|
54
|
+
- ALSO, could add support for "dependencies2", to prevent npm and yarn from installing the dependencies (as they don't support "sources"), allowing the package to install them at runtime, allowing for better compatibility
|
|
55
|
+
- In conjunction with optionalDependencies make it possible to add dependencies that don't exist in npm
|
|
56
|
+
- The lock file will have to mark who set the source, potentially giving multiple setters, with the highest being the one that actual sets the source.
|