@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/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
+ }