@procedures/lib 0.0.0-stage → 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.
Files changed (114) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +119 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/cli-flags.d.ts +27 -0
  6. package/dist/cli-flags.d.ts.map +1 -0
  7. package/dist/cli-flags.js +33 -0
  8. package/dist/cli-flags.js.map +1 -0
  9. package/dist/dag/builder.d.ts +18 -0
  10. package/dist/dag/builder.d.ts.map +1 -0
  11. package/dist/dag/builder.js +35 -0
  12. package/dist/dag/builder.js.map +1 -0
  13. package/dist/dag/index.d.ts +12 -0
  14. package/dist/dag/index.d.ts.map +1 -0
  15. package/dist/dag/index.js +12 -0
  16. package/dist/dag/index.js.map +1 -0
  17. package/dist/git/index.d.ts +5 -0
  18. package/dist/git/index.d.ts.map +1 -0
  19. package/dist/git/index.js +5 -0
  20. package/dist/git/index.js.map +1 -0
  21. package/dist/git/ref-parser.d.ts +34 -0
  22. package/dist/git/ref-parser.d.ts.map +1 -0
  23. package/dist/git/ref-parser.js +70 -0
  24. package/dist/git/ref-parser.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +19 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/module.d.ts +22 -0
  30. package/dist/module.d.ts.map +1 -0
  31. package/dist/module.js +180 -0
  32. package/dist/module.js.map +1 -0
  33. package/dist/procedures/core/catch.d.ts +33 -0
  34. package/dist/procedures/core/catch.d.ts.map +1 -0
  35. package/dist/procedures/core/catch.js +118 -0
  36. package/dist/procedures/core/catch.js.map +1 -0
  37. package/dist/procedures/core/index.d.ts +9 -0
  38. package/dist/procedures/core/index.d.ts.map +1 -0
  39. package/dist/procedures/core/index.js +8 -0
  40. package/dist/procedures/core/index.js.map +1 -0
  41. package/dist/procedures/dag/index.d.ts +5 -0
  42. package/dist/procedures/dag/index.d.ts.map +1 -0
  43. package/dist/procedures/dag/index.js +5 -0
  44. package/dist/procedures/dag/index.js.map +1 -0
  45. package/dist/procedures/dag/traverse.d.ts +54 -0
  46. package/dist/procedures/dag/traverse.d.ts.map +1 -0
  47. package/dist/procedures/dag/traverse.js +252 -0
  48. package/dist/procedures/dag/traverse.js.map +1 -0
  49. package/dist/procedures/ecosystem/index.d.ts +7 -0
  50. package/dist/procedures/ecosystem/index.d.ts.map +1 -0
  51. package/dist/procedures/ecosystem/index.js +6 -0
  52. package/dist/procedures/ecosystem/index.js.map +1 -0
  53. package/dist/procedures/ecosystem/procedures.d.ts +63 -0
  54. package/dist/procedures/ecosystem/procedures.d.ts.map +1 -0
  55. package/dist/procedures/ecosystem/procedures.js +215 -0
  56. package/dist/procedures/ecosystem/procedures.js.map +1 -0
  57. package/dist/procedures/lib/audit.d.ts +29 -0
  58. package/dist/procedures/lib/audit.d.ts.map +1 -0
  59. package/dist/procedures/lib/audit.js +236 -0
  60. package/dist/procedures/lib/audit.js.map +1 -0
  61. package/dist/procedures/lib/index.d.ts +8 -0
  62. package/dist/procedures/lib/index.d.ts.map +1 -0
  63. package/dist/procedures/lib/index.js +8 -0
  64. package/dist/procedures/lib/index.js.map +1 -0
  65. package/dist/procedures/lib/new.d.ts +20 -0
  66. package/dist/procedures/lib/new.d.ts.map +1 -0
  67. package/dist/procedures/lib/new.js +205 -0
  68. package/dist/procedures/lib/new.js.map +1 -0
  69. package/dist/procedures/lib/rename.d.ts +28 -0
  70. package/dist/procedures/lib/rename.d.ts.map +1 -0
  71. package/dist/procedures/lib/rename.js +267 -0
  72. package/dist/procedures/lib/rename.js.map +1 -0
  73. package/dist/procedures/lib/scan.d.ts +14 -0
  74. package/dist/procedures/lib/scan.d.ts.map +1 -0
  75. package/dist/procedures/lib/scan.js +102 -0
  76. package/dist/procedures/lib/scan.js.map +1 -0
  77. package/dist/register.d.ts +7 -0
  78. package/dist/register.d.ts.map +1 -0
  79. package/dist/register.js +9 -0
  80. package/dist/register.js.map +1 -0
  81. package/dist/scoped-input.d.ts +17 -0
  82. package/dist/scoped-input.d.ts.map +1 -0
  83. package/dist/scoped-input.js +23 -0
  84. package/dist/scoped-input.js.map +1 -0
  85. package/dist/types.d.ts +248 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +231 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/workspace.d.ts +46 -0
  90. package/dist/workspace.d.ts.map +1 -0
  91. package/dist/workspace.js +98 -0
  92. package/dist/workspace.js.map +1 -0
  93. package/package.json +87 -3
  94. package/src/cli-flags.ts +49 -0
  95. package/src/dag/builder.ts +44 -0
  96. package/src/dag/index.ts +23 -0
  97. package/src/git/index.ts +11 -0
  98. package/src/git/ref-parser.ts +83 -0
  99. package/src/index.ts +56 -0
  100. package/src/module.ts +232 -0
  101. package/src/procedures/core/catch.ts +142 -0
  102. package/src/procedures/core/index.ts +9 -0
  103. package/src/procedures/dag/index.ts +5 -0
  104. package/src/procedures/dag/traverse.ts +281 -0
  105. package/src/procedures/ecosystem/index.ts +12 -0
  106. package/src/procedures/ecosystem/procedures.ts +317 -0
  107. package/src/procedures/lib/audit.ts +307 -0
  108. package/src/procedures/lib/index.ts +8 -0
  109. package/src/procedures/lib/new.ts +253 -0
  110. package/src/procedures/lib/rename.ts +355 -0
  111. package/src/procedures/lib/scan.ts +143 -0
  112. package/src/register.ts +11 -0
  113. package/src/types.ts +526 -0
  114. package/src/workspace.ts +110 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Workspace helpers
3
+ *
4
+ * The client packages live in one pnpm workspace (the client monorepo). These helpers
5
+ * find the workspace root and decide which dependencies link two ecosystem packages,
6
+ * so the lib.* procedures work on the monorepo instead of one git repository per package.
7
+ */
8
+
9
+ import { existsSync } from "node:fs";
10
+ import { homedir } from "node:os";
11
+ import { dirname, join, resolve } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { isMark1Russell7Ref } from "./git/index.js";
14
+
15
+ /**
16
+ * Expand a leading `~/` to the home directory
17
+ */
18
+ export function expandHome(p: string): string {
19
+ if (p === "~") {
20
+ return homedir();
21
+ }
22
+ if (p.startsWith("~/") || p.startsWith("~\\")) {
23
+ return join(homedir(), p.slice(2));
24
+ }
25
+ return p;
26
+ }
27
+
28
+ /**
29
+ * Find the nearest folder at or above `start` that holds pnpm-workspace.yaml
30
+ */
31
+ export function findWorkspaceRoot(start: string): string | null {
32
+ let dir = resolve(start);
33
+ for (;;) {
34
+ if (existsSync(join(dir, "pnpm-workspace.yaml"))) {
35
+ return dir;
36
+ }
37
+ const parent = dirname(dir);
38
+ if (parent === dir) {
39
+ return null;
40
+ }
41
+ dir = parent;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Resolve the workspace root for a procedure call: the explicit `rootPath` if given,
47
+ * else the workspace that contains this package.
48
+ */
49
+ export function resolveWorkspaceRoot(rootPath?: string): string {
50
+ if (rootPath) {
51
+ // Only a real workspace root: lib.new runs that workspace's cue CLI, and lib.rename rewrites
52
+ // its files, so a rootPath elsewhere ran a script from any folder (deep dive DATA-18)
53
+ const root = resolve(expandHome(rootPath));
54
+ if (!existsSync(join(root, "pnpm-workspace.yaml"))) {
55
+ throw new Error(`Not a workspace root (no pnpm-workspace.yaml): ${root}`);
56
+ }
57
+ return root;
58
+ }
59
+ const own = findWorkspaceRoot(dirname(fileURLToPath(import.meta.url)));
60
+ if (!own) {
61
+ throw new Error("Could not find the workspace root (no pnpm-workspace.yaml above client-lib). Pass rootPath.");
62
+ }
63
+ return own;
64
+ }
65
+
66
+ /**
67
+ * The folder that holds the workspace packages
68
+ */
69
+ export function packagesDir(root: string): string {
70
+ return join(root, "packages");
71
+ }
72
+
73
+ /**
74
+ * Return true if a dependency spec links to another ecosystem package:
75
+ * a workspace link (`workspace:*`) or a `github:mark1russell7/...` reference.
76
+ */
77
+ export function isEcosystemDependencySpec(spec: string): boolean {
78
+ return spec.startsWith("workspace:") || isMark1Russell7Ref(spec);
79
+ }
80
+
81
+ /**
82
+ * The npm scopes of the ecosystem: `@procedures` for the packages of this workspace, and
83
+ * `@mark1russell7` for the general packages (cue, splay, docker-sqlite and the others).
84
+ */
85
+ export const ECOSYSTEM_SCOPES: readonly string[] = ["@procedures/", "@mark1russell7/"];
86
+
87
+ /** True for the name of a package of the ecosystem scopes. */
88
+ export function isEcosystemPackageName(name: string): boolean {
89
+ return ECOSYSTEM_SCOPES.some((scope) => name.startsWith(scope));
90
+ }
91
+
92
+ /**
93
+ * Collect the names of the ecosystem packages (`@procedures/*` and `@mark1russell7/*`) that a
94
+ * package.json depends on (dependencies, devDependencies and peerDependencies), without duplicates.
95
+ */
96
+ export function extractEcosystemDeps(pkg: {
97
+ dependencies?: Record<string, string> | undefined;
98
+ devDependencies?: Record<string, string> | undefined;
99
+ peerDependencies?: Record<string, string> | undefined;
100
+ }): string[] {
101
+ const names = new Set<string>();
102
+ for (const deps of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies]) {
103
+ for (const [name, spec] of Object.entries(deps ?? {})) {
104
+ if (isEcosystemPackageName(name) && isEcosystemDependencySpec(spec)) {
105
+ names.add(name);
106
+ }
107
+ }
108
+ }
109
+ return [...names];
110
+ }