@effected/package-json 0.1.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.js +76 -0
- package/DevEngines.js +42 -0
- package/LICENSE +21 -0
- package/License.js +45 -0
- package/Package.js +329 -0
- package/PackageJsonFile.js +128 -0
- package/PackageManager.js +63 -0
- package/PackageName.js +62 -0
- package/PackageValidator.js +146 -0
- package/Person.js +51 -0
- package/README.md +215 -0
- package/index.d.ts +747 -0
- package/index.js +12 -0
- package/internal/format.js +106 -0
- package/package.json +50 -0
- package/tsdoc-metadata.json +11 -0
package/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Dependency, isUnresolvedDependency } from "./Dependency.js";
|
|
2
|
+
import { DevEngine, DevEngineOrArray, DevEnginesSchema } from "./DevEngines.js";
|
|
3
|
+
import { InvalidSpdxLicenseError, SpdxLicense, isValidSpdx } from "./License.js";
|
|
4
|
+
import { PackageManager } from "./PackageManager.js";
|
|
5
|
+
import { InvalidPackageNameError, PackageName, ScopedPackageName, UnscopedPackageName } from "./PackageName.js";
|
|
6
|
+
import { Person } from "./Person.js";
|
|
7
|
+
import { BinField, DependencyMapField, ExportsField, Package, PackageDecodeError, PeerDependenciesMetaField, PublishConfigField, RepositoryField, StringMapField } from "./Package.js";
|
|
8
|
+
import { PackageJsonFile, PackageJsonNotFoundError, PackageJsonParseError, PackageJsonReadError, PackageJsonWriteError } from "./PackageJsonFile.js";
|
|
9
|
+
import { PackageValidationError, PackageValidator, defaultRules, noLocalDepsRule, noUnresolvedDepsRule } from "./PackageValidator.js";
|
|
10
|
+
import { DependencySpecifier, InvalidDependencySpecifierError, isValidDependencySpecifier } from "@effected/npm";
|
|
11
|
+
|
|
12
|
+
export { BinField, Dependency, DependencyMapField, DependencySpecifier, DevEngine, DevEngineOrArray, DevEnginesSchema, ExportsField, InvalidDependencySpecifierError, InvalidPackageNameError, InvalidSpdxLicenseError, Package, PackageDecodeError, PackageJsonFile, PackageJsonNotFoundError, PackageJsonParseError, PackageJsonReadError, PackageJsonWriteError, PackageManager, PackageName, PackageValidationError, PackageValidator, PeerDependenciesMetaField, Person, PublishConfigField, RepositoryField, ScopedPackageName, SpdxLicense, StringMapField, UnscopedPackageName, defaultRules, isUnresolvedDependency, isValidDependencySpecifier, isValidSpdx, noLocalDepsRule, noUnresolvedDepsRule };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
//#region src/internal/format.ts
|
|
2
|
+
const KEY_INDEX = new Map([
|
|
3
|
+
"$schema",
|
|
4
|
+
"name",
|
|
5
|
+
"version",
|
|
6
|
+
"private",
|
|
7
|
+
"description",
|
|
8
|
+
"keywords",
|
|
9
|
+
"homepage",
|
|
10
|
+
"bugs",
|
|
11
|
+
"repository",
|
|
12
|
+
"funding",
|
|
13
|
+
"license",
|
|
14
|
+
"author",
|
|
15
|
+
"contributors",
|
|
16
|
+
"type",
|
|
17
|
+
"imports",
|
|
18
|
+
"exports",
|
|
19
|
+
"main",
|
|
20
|
+
"module",
|
|
21
|
+
"browser",
|
|
22
|
+
"bin",
|
|
23
|
+
"man",
|
|
24
|
+
"files",
|
|
25
|
+
"directories",
|
|
26
|
+
"workspaces",
|
|
27
|
+
"scripts",
|
|
28
|
+
"config",
|
|
29
|
+
"dependencies",
|
|
30
|
+
"devDependencies",
|
|
31
|
+
"peerDependencies",
|
|
32
|
+
"peerDependenciesMeta",
|
|
33
|
+
"optionalDependencies",
|
|
34
|
+
"bundleDependencies",
|
|
35
|
+
"overrides",
|
|
36
|
+
"engines",
|
|
37
|
+
"devEngines",
|
|
38
|
+
"os",
|
|
39
|
+
"cpu",
|
|
40
|
+
"publishConfig",
|
|
41
|
+
"packageManager"
|
|
42
|
+
].map((k, i) => [k, i]));
|
|
43
|
+
/**
|
|
44
|
+
* Deterministic, locale-independent string comparison by code point. A bare
|
|
45
|
+
* `localeCompare` sorts differently across ICU builds/locales; package.json key
|
|
46
|
+
* order must be stable everywhere.
|
|
47
|
+
*/
|
|
48
|
+
const byCodePoint = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
49
|
+
const DEPENDENCY_KEYS = /* @__PURE__ */ new Set([
|
|
50
|
+
"dependencies",
|
|
51
|
+
"devDependencies",
|
|
52
|
+
"peerDependencies",
|
|
53
|
+
"optionalDependencies",
|
|
54
|
+
"bundleDependencies"
|
|
55
|
+
]);
|
|
56
|
+
/** Alphabetize the entries of a plain-object dependency map. */
|
|
57
|
+
const sortDependencyMap = (value) => {
|
|
58
|
+
const result = {};
|
|
59
|
+
for (const key of Object.keys(value).sort(byCodePoint)) result[key] = value[key];
|
|
60
|
+
return result;
|
|
61
|
+
};
|
|
62
|
+
const isPlainObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
63
|
+
/**
|
|
64
|
+
* Order top-level keys canonically (known keys by {@link KEY_ORDER}, the rest
|
|
65
|
+
* alphabetically) and alphabetize dependency-map entries.
|
|
66
|
+
*/
|
|
67
|
+
const sortKeys = (obj) => {
|
|
68
|
+
const known = [];
|
|
69
|
+
const rest = [];
|
|
70
|
+
for (const key of Object.keys(obj)) if (KEY_INDEX.has(key)) known.push([key, obj[key]]);
|
|
71
|
+
else rest.push([key, obj[key]]);
|
|
72
|
+
known.sort((a, b) => KEY_INDEX.get(a[0]) - KEY_INDEX.get(b[0]));
|
|
73
|
+
rest.sort((a, b) => byCodePoint(a[0], b[0]));
|
|
74
|
+
const result = {};
|
|
75
|
+
for (const [key, value] of [...known, ...rest]) result[key] = DEPENDENCY_KEYS.has(key) && isPlainObject(value) ? sortDependencyMap(value) : value;
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
const DEPENDENCY_MAP_KEYS = [
|
|
79
|
+
"dependencies",
|
|
80
|
+
"devDependencies",
|
|
81
|
+
"peerDependencies",
|
|
82
|
+
"optionalDependencies"
|
|
83
|
+
];
|
|
84
|
+
/** Remove dependency-map keys whose value is an empty object. */
|
|
85
|
+
const stripEmptyDependencyMaps = (raw) => {
|
|
86
|
+
const result = { ...raw };
|
|
87
|
+
for (const key of DEPENDENCY_MAP_KEYS) {
|
|
88
|
+
const value = result[key];
|
|
89
|
+
if (isPlainObject(value) && Object.keys(value).length === 0) delete result[key];
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Render an already-encoded package.json record to a JSON string, applying the
|
|
95
|
+
* empty-map strip, canonical key ordering and a trailing newline unless the
|
|
96
|
+
* corresponding options opt out.
|
|
97
|
+
*/
|
|
98
|
+
const renderJson = (raw, options) => {
|
|
99
|
+
let record = options.stripEmpty ? stripEmptyDependencyMaps(raw) : raw;
|
|
100
|
+
if (options.sort) record = sortKeys(record);
|
|
101
|
+
const json = JSON.stringify(record, null, options.indent);
|
|
102
|
+
return options.newline ? `${json}\n` : json;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
106
|
+
export { renderJson, sortKeys, stripEmptyDependencyMaps };
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@effected/package-json",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "package.json parsing, editing, validation and file IO as Effect schemas.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"package.json",
|
|
8
|
+
"npm",
|
|
9
|
+
"manifest",
|
|
10
|
+
"effect",
|
|
11
|
+
"schema",
|
|
12
|
+
"validation",
|
|
13
|
+
"effected"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/spencerbeggs/effected/tree/main/packages/package-json#readme",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/spencerbeggs/effected/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/spencerbeggs/effected.git",
|
|
22
|
+
"directory": "packages/package-json"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": {
|
|
26
|
+
"name": "C. Spencer Beggs",
|
|
27
|
+
"email": "spencer@beggs.codes",
|
|
28
|
+
"url": "https://spencerbeg.gs"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"type": "module",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./index.d.ts",
|
|
35
|
+
"import": "./index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@effected/npm": "0.1.0",
|
|
41
|
+
"@effected/semver": "0.1.0",
|
|
42
|
+
"spdx-expression-parse": "^4.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"effect": "4.0.0-beta.98"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=24.11.0"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
+
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
+
{
|
|
4
|
+
"tsdocVersion": "0.12",
|
|
5
|
+
"toolPackages": [
|
|
6
|
+
{
|
|
7
|
+
"packageName": "@microsoft/api-extractor",
|
|
8
|
+
"packageVersion": "7.58.9"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|