@getripple/core 1.0.4

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.
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ /**
3
+ * normalizer.ts — Ripple
4
+ * Resolves TypeScript/JavaScript import specifiers to absolute file paths.
5
+ *
6
+ * Resolution order:
7
+ * 1. Scoped @org/package specifiers → check workspace packages first,
8
+ * then tsconfig aliases, else null (npm package)
9
+ * 2. Bare node_modules specifiers → null immediately
10
+ * 3. Style files (.css/.scss/etc) → null (graph.ts handles directly)
11
+ * 4. Relative imports (./) → resolve from importer directory
12
+ * 5. tsconfig.json path aliases → read and cache from tsconfig.json
13
+ * 6. @/ alias fallback → maps to workspaceRoot (Next.js default)
14
+ *
15
+ * Monorepo rule:
16
+ * Scoped imports may point to local workspace packages, not npm packages.
17
+ * loadWorkspacePackages() reads pnpm-workspace.yaml, lerna.json, or the
18
+ * package.json workspaces field so @my-org/utils can resolve to packages/utils.
19
+ *
20
+ * Path invariant:
21
+ * Returned paths use forward slashes. graph.ts converts them to OS-native
22
+ * graph keys via toGraphPath() before storing them.
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.clearAliasCache = exports.normalizeImportPath = void 0;
49
+ const path = __importStar(require("path"));
50
+ const fs = __importStar(require("fs"));
51
+ // ────────────────────────────────────────────────────────────────────────────
52
+ // WORKSPACE PACKAGE DETECTION
53
+ // ────────────────────────────────────────────────────────────────────────────
54
+ //
55
+ // Maps package name → absolute path to package root on disk.
56
+ // Example: "@my-org/utils" -> "packages/utils"
57
+ //
58
+ // Populated by loadWorkspacePackages(), which reads:
59
+ // - pnpm-workspace.yaml (pnpm monorepos)
60
+ // - lerna.json (Lerna monorepos)
61
+ // - package.json workspaces field (npm/yarn workspaces)
62
+ const workspacePackageCache = new Map();
63
+ function loadWorkspacePackages(workspaceRoot) {
64
+ if (workspacePackageCache.has(workspaceRoot)) {
65
+ return workspacePackageCache.get(workspaceRoot);
66
+ }
67
+ const packages = new Map();
68
+ // Discover which glob patterns define local packages.
69
+ const packageGlobs = [];
70
+ // ── pnpm-workspace.yaml ───────────────────────────────────────────────────
71
+ const pnpmWorkspacePath = path.join(workspaceRoot, "pnpm-workspace.yaml");
72
+ if (fs.existsSync(pnpmWorkspacePath)) {
73
+ try {
74
+ const raw = fs.readFileSync(pnpmWorkspacePath, "utf8");
75
+ // Simple YAML line parser for "packages:" sections with "- 'glob'" entries.
76
+ // We do not pull in a full YAML parser to keep the bundle small.
77
+ let inPackages = false;
78
+ raw.split("\n").forEach((line) => {
79
+ const trimmed = line.trim();
80
+ if (trimmed === "packages:") {
81
+ inPackages = true;
82
+ return;
83
+ }
84
+ if (inPackages && trimmed.startsWith("-")) {
85
+ // Strip leading "- " and surrounding quotes.
86
+ const glob = trimmed
87
+ .slice(1)
88
+ .trim()
89
+ .replace(/^['"]|['"]$/g, "");
90
+ if (glob && !glob.startsWith("#")) {
91
+ packageGlobs.push(glob);
92
+ }
93
+ }
94
+ else if (inPackages && !trimmed.startsWith("-") && trimmed.length > 0) {
95
+ inPackages = false;
96
+ }
97
+ });
98
+ }
99
+ catch { /* malformed yaml — skip */ }
100
+ }
101
+ // ── lerna.json ────────────────────────────────────────────────────────────
102
+ const lernaPath = path.join(workspaceRoot, "lerna.json");
103
+ if (fs.existsSync(lernaPath) && packageGlobs.length === 0) {
104
+ try {
105
+ const lerna = JSON.parse(fs.readFileSync(lernaPath, "utf8"));
106
+ if (Array.isArray(lerna.packages)) {
107
+ lerna.packages.forEach((g) => packageGlobs.push(g));
108
+ }
109
+ }
110
+ catch { /* malformed json — skip */ }
111
+ }
112
+ // ── package.json workspaces ───────────────────────────────────────────────
113
+ const rootPkgPath = path.join(workspaceRoot, "package.json");
114
+ if (fs.existsSync(rootPkgPath) && packageGlobs.length === 0) {
115
+ try {
116
+ const pkg = JSON.parse(fs.readFileSync(rootPkgPath, "utf8"));
117
+ // workspaces can be an array ["packages/*"] or an object { packages: [...] }
118
+ const ws = pkg.workspaces;
119
+ if (Array.isArray(ws)) {
120
+ ws.forEach((g) => packageGlobs.push(g));
121
+ }
122
+ else if (ws && Array.isArray(ws.packages)) {
123
+ ws.packages.forEach((g) => packageGlobs.push(g));
124
+ }
125
+ }
126
+ catch { /* malformed json — skip */ }
127
+ }
128
+ if (packageGlobs.length === 0) {
129
+ workspacePackageCache.set(workspaceRoot, packages);
130
+ return packages;
131
+ }
132
+ // ── Resolve globs to actual package directories ───────────────────────────
133
+ // Resolve simple globs manually to avoid adding a YAML/glob parser here:
134
+ // "packages/*" → scan every directory inside packages/
135
+ // "apps/*" → scan every directory inside apps/
136
+ // "packages/utils" → exact directory
137
+ packageGlobs.forEach((glob) => {
138
+ if (glob.endsWith("/*") || glob.endsWith("\\*")) {
139
+ // Directory wildcard: scan one level deep.
140
+ const baseDir = path.join(workspaceRoot, glob.slice(0, -2));
141
+ if (!fs.existsSync(baseDir)) {
142
+ return;
143
+ }
144
+ try {
145
+ fs.readdirSync(baseDir).forEach((entry) => {
146
+ const entryPath = path.join(baseDir, entry);
147
+ try {
148
+ if (!fs.statSync(entryPath).isDirectory()) {
149
+ return;
150
+ }
151
+ }
152
+ catch {
153
+ return;
154
+ }
155
+ registerPackage(entryPath, packages);
156
+ });
157
+ }
158
+ catch { /* unreadable directory */ }
159
+ }
160
+ else {
161
+ // Exact path: register one package directory.
162
+ const entryPath = path.join(workspaceRoot, glob);
163
+ if (fs.existsSync(entryPath)) {
164
+ registerPackage(entryPath, packages);
165
+ }
166
+ }
167
+ });
168
+ workspacePackageCache.set(workspaceRoot, packages);
169
+ return packages;
170
+ }
171
+ /**
172
+ * Reads a package directory and registers its package.json "name" field.
173
+ */
174
+ function registerPackage(pkgDir, packages) {
175
+ const pkgJsonPath = path.join(pkgDir, "package.json");
176
+ if (!fs.existsSync(pkgJsonPath)) {
177
+ return;
178
+ }
179
+ try {
180
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
181
+ if (pkg.name && typeof pkg.name === "string") {
182
+ packages.set(pkg.name, pkgDir);
183
+ }
184
+ }
185
+ catch { /* malformed package.json — skip */ }
186
+ }
187
+ /**
188
+ * Resolves a workspace package import specifier to a local file path.
189
+ *
190
+ * @param specifier e.g. "@my-org/utils" or "@my-org/utils/helpers"
191
+ * @param packages workspace package map from loadWorkspacePackages()
192
+ * @returns absolute forward-slash path to the resolved file, or null
193
+ */
194
+ function resolveWorkspaceImport(specifier, packages) {
195
+ // Exact package import, such as "@my-org/utils".
196
+ if (packages.has(specifier)) {
197
+ const pkgDir = packages.get(specifier);
198
+ // Resolve to the package's main entry point.
199
+ const resolved = resolvePackageEntry(pkgDir);
200
+ return resolved ? resolved.split(path.sep).join("/") : null;
201
+ }
202
+ // Sub-path import, such as "@my-org/utils/helpers".
203
+ for (const [pkgName, pkgDir] of packages) {
204
+ if (specifier.startsWith(pkgName + "/")) {
205
+ const subPath = specifier.slice(pkgName.length + 1);
206
+ const absolutePath = path.join(pkgDir, subPath);
207
+ const resolved = resolveWithExtension(absolutePath);
208
+ if (resolved) {
209
+ return resolved.split(path.sep).join("/");
210
+ }
211
+ // src/ subdirectory fallback is common in TypeScript workspace packages.
212
+ const srcPath = path.join(pkgDir, "src", subPath);
213
+ const resolvedSrc = resolveWithExtension(srcPath);
214
+ if (resolvedSrc) {
215
+ return resolvedSrc.split(path.sep).join("/");
216
+ }
217
+ }
218
+ }
219
+ return null;
220
+ }
221
+ /**
222
+ * Resolves the main entry point of a workspace package directory.
223
+ * Reads package.json "main", "exports", or "module" fields.
224
+ * Falls back to src/index.ts and index.ts.
225
+ */
226
+ function resolvePackageEntry(pkgDir) {
227
+ const pkgJsonPath = path.join(pkgDir, "package.json");
228
+ if (fs.existsSync(pkgJsonPath)) {
229
+ try {
230
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
231
+ // Prefer package exports when present.
232
+ if (pkg.exports) {
233
+ const exportsMain = typeof pkg.exports === "string"
234
+ ? pkg.exports
235
+ : pkg.exports["."]?.import || pkg.exports["."]?.require || pkg.exports["."];
236
+ if (typeof exportsMain === "string") {
237
+ const resolved = resolveWithExtension(path.join(pkgDir, exportsMain));
238
+ if (resolved) {
239
+ return resolved;
240
+ }
241
+ }
242
+ }
243
+ // Fall back through common package entry fields.
244
+ if (pkg.main) {
245
+ const resolved = resolveWithExtension(path.join(pkgDir, pkg.main));
246
+ if (resolved) {
247
+ return resolved;
248
+ }
249
+ }
250
+ if (pkg.module) {
251
+ const resolved = resolveWithExtension(path.join(pkgDir, pkg.module));
252
+ if (resolved) {
253
+ return resolved;
254
+ }
255
+ }
256
+ }
257
+ catch { /* malformed package.json */ }
258
+ }
259
+ // TypeScript workspace packages commonly expose src/index.*.
260
+ const srcIndex = resolveWithExtension(path.join(pkgDir, "src", "index"));
261
+ if (srcIndex) {
262
+ return srcIndex;
263
+ }
264
+ // Last package-local fallback: index.* at the package root.
265
+ const rootIndex = resolveWithExtension(path.join(pkgDir, "index"));
266
+ if (rootIndex) {
267
+ return rootIndex;
268
+ }
269
+ return null;
270
+ }
271
+ const aliasCache = new Map();
272
+ function loadAliases(workspaceRoot) {
273
+ if (aliasCache.has(workspaceRoot)) {
274
+ return aliasCache.get(workspaceRoot);
275
+ }
276
+ const entries = [];
277
+ const tsconfigPath = path.join(workspaceRoot, "tsconfig.json");
278
+ if (fs.existsSync(tsconfigPath)) {
279
+ try {
280
+ const raw = fs.readFileSync(tsconfigPath, "utf8");
281
+ // tsconfig.json permits comments, but JSON.parse does not.
282
+ const stripped = raw
283
+ .replace(/\/\/.*$/gm, "")
284
+ .replace(/\/\*[\s\S]*?\*\//g, "");
285
+ // tsconfig.json also permits trailing commas.
286
+ const cleaned = stripped.replace(/,\s*([}\]])/g, "$1");
287
+ const tsconfig = JSON.parse(cleaned);
288
+ const compilerOptions = tsconfig?.compilerOptions ?? {};
289
+ const paths = compilerOptions?.paths ?? {};
290
+ const baseUrl = compilerOptions?.baseUrl ?? ".";
291
+ const baseDir = path.resolve(workspaceRoot, baseUrl);
292
+ Object.entries(paths).forEach(([alias, targets]) => {
293
+ if (!Array.isArray(targets)) {
294
+ return;
295
+ }
296
+ const isWildcard = alias.endsWith("/*");
297
+ const prefix = isWildcard ? alias.slice(0, -1) : alias;
298
+ const resolvedTargets = targets.map((t) => {
299
+ const clean = isWildcard && t.endsWith("/*") ? t.slice(0, -2) : t;
300
+ return path.resolve(baseDir, clean);
301
+ });
302
+ entries.push({ prefix, wildcard: isWildcard, targets: resolvedTargets });
303
+ });
304
+ }
305
+ catch {
306
+ console.warn("[Ripple] tsconfig.json could not be parsed — using @/ fallback only");
307
+ }
308
+ }
309
+ aliasCache.set(workspaceRoot, entries);
310
+ return entries;
311
+ }
312
+ // ────────────────────────────────────────────────────────────────────────────
313
+ // EXTENSION RESOLUTION
314
+ // ────────────────────────────────────────────────────────────────────────────
315
+ const EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
316
+ const RUNTIME_EXTENSION_FALLBACKS = new Set([".js", ".jsx", ".mjs", ".cjs"]);
317
+ function resolveWithExtension(absolutePath) {
318
+ if (fs.existsSync(absolutePath)) {
319
+ try {
320
+ if (fs.statSync(absolutePath).isFile()) {
321
+ return absolutePath;
322
+ }
323
+ }
324
+ catch { /* continue to extension probing */ }
325
+ }
326
+ // NodeNext/ESM TypeScript projects often import "./file.js" from source
327
+ // while the checked-in source file is "./file.ts".
328
+ const importedExt = path.extname(absolutePath).toLowerCase();
329
+ if (RUNTIME_EXTENSION_FALLBACKS.has(importedExt)) {
330
+ const withoutRuntimeExt = absolutePath.slice(0, -importedExt.length);
331
+ for (const ext of EXTENSIONS) {
332
+ const candidate = withoutRuntimeExt + ext;
333
+ if (fs.existsSync(candidate)) {
334
+ return candidate;
335
+ }
336
+ }
337
+ }
338
+ for (const ext of EXTENSIONS) {
339
+ const candidate = absolutePath + ext;
340
+ if (fs.existsSync(candidate)) {
341
+ return candidate;
342
+ }
343
+ }
344
+ for (const ext of EXTENSIONS) {
345
+ const candidate = path.join(absolutePath, `index${ext}`);
346
+ if (fs.existsSync(candidate)) {
347
+ return candidate;
348
+ }
349
+ }
350
+ return null;
351
+ }
352
+ // ────────────────────────────────────────────────────────────────────────────
353
+ // MAIN EXPORT
354
+ // ────────────────────────────────────────────────────────────────────────────
355
+ /**
356
+ * Resolves an import specifier to an absolute file path.
357
+ *
358
+ * Returns null for external npm packages and unresolvable paths.
359
+ * Returns a forward-slash path string on success.
360
+ */
361
+ function normalizeImportPath(specifier, importerPath, workspaceRoot) {
362
+ // ── Scoped package resolution (@org/package) ──────────────────────────────
363
+ // Resolution order for @org/* imports:
364
+ // 1. Workspace packages — local monorepo packages
365
+ // 2. tsconfig path aliases — @scope/* aliases in tsconfig
366
+ // 3. null — external npm package
367
+ if (specifier.startsWith("@") && !specifier.startsWith("@/")) {
368
+ const secondSlash = specifier.indexOf("/", 1);
369
+ if (secondSlash !== -1) {
370
+ // Prefer local workspace packages before classifying a scoped import as npm.
371
+ const workspacePackages = loadWorkspacePackages(workspaceRoot);
372
+ if (workspacePackages.size > 0) {
373
+ const workspaceResolved = resolveWorkspaceImport(specifier, workspacePackages);
374
+ if (workspaceResolved) {
375
+ return workspaceResolved;
376
+ }
377
+ }
378
+ // Then allow tsconfig aliases such as @scope/* to resolve locally.
379
+ const aliases = loadAliases(workspaceRoot);
380
+ const matchesAlias = aliases.some((a) => specifier.startsWith(a.prefix));
381
+ if (!matchesAlias) {
382
+ // Not a workspace package and not a tsconfig alias: treat as npm.
383
+ return null;
384
+ }
385
+ // Falls through to tsconfig alias resolution below
386
+ }
387
+ }
388
+ // ── Bare node_modules specifiers ─────────────────────────────────────────
389
+ if (!specifier.startsWith(".") &&
390
+ !specifier.startsWith("@") &&
391
+ !specifier.startsWith("~") &&
392
+ !specifier.startsWith("$") &&
393
+ !specifier.startsWith("#")) {
394
+ return null;
395
+ }
396
+ // ── Style files ───────────────────────────────────────────────────────────
397
+ if (specifier.endsWith(".css") ||
398
+ specifier.endsWith(".scss") ||
399
+ specifier.endsWith(".sass") ||
400
+ specifier.endsWith(".less")) {
401
+ return null;
402
+ }
403
+ // ── Relative imports ──────────────────────────────────────────────────────
404
+ if (specifier.startsWith(".")) {
405
+ const importerDir = path.dirname(importerPath);
406
+ const absolutePath = path.resolve(importerDir, specifier);
407
+ const resolved = resolveWithExtension(absolutePath);
408
+ if (!resolved) {
409
+ return null;
410
+ }
411
+ return resolved.split(path.sep).join("/");
412
+ }
413
+ // ── tsconfig.json path aliases ────────────────────────────────────────────
414
+ const aliases = loadAliases(workspaceRoot);
415
+ for (const alias of aliases) {
416
+ if (!specifier.startsWith(alias.prefix)) {
417
+ continue;
418
+ }
419
+ const rest = alias.wildcard ? specifier.slice(alias.prefix.length) : "";
420
+ for (const targetDir of alias.targets) {
421
+ const absolutePath = alias.wildcard
422
+ ? path.join(targetDir, rest)
423
+ : targetDir;
424
+ const resolved = resolveWithExtension(absolutePath);
425
+ if (resolved) {
426
+ return resolved.split(path.sep).join("/");
427
+ }
428
+ }
429
+ }
430
+ // ── @/ fallback ───────────────────────────────────────────────────────────
431
+ if (specifier.startsWith("@/")) {
432
+ const withoutAlias = specifier.slice(2);
433
+ const absolutePath = path.join(workspaceRoot, withoutAlias);
434
+ const resolved = resolveWithExtension(absolutePath);
435
+ if (!resolved) {
436
+ return null;
437
+ }
438
+ return resolved.split(path.sep).join("/");
439
+ }
440
+ return null;
441
+ }
442
+ exports.normalizeImportPath = normalizeImportPath;
443
+ // ────────────────────────────────────────────────────────────────────────────
444
+ // CACHE MANAGEMENT
445
+ // ────────────────────────────────────────────────────────────────────────────
446
+ /**
447
+ * Clears both the alias cache and workspace package cache for a workspace.
448
+ * Called from extension.ts when tsconfig.json changes during a session.
449
+ */
450
+ function clearAliasCache(workspaceRoot) {
451
+ aliasCache.delete(workspaceRoot);
452
+ workspacePackageCache.delete(workspaceRoot);
453
+ }
454
+ exports.clearAliasCache = clearAliasCache;
455
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ChangeIntent, ControlBoundaryRisk, ControlMode, HumanGate } from "./change-intent";
2
+ export declare const RIPPLE_POLICY_PATH = ".ripple/policy.json";
3
+ export type RipplePolicyRiskRule = {
4
+ paths: string[];
5
+ risk?: ControlBoundaryRisk;
6
+ requireHumanBeforeEdit?: boolean;
7
+ requireHumanBeforeMerge?: boolean;
8
+ allowPrMode?: boolean;
9
+ };
10
+ export type RipplePolicy = {
11
+ protocol?: "ripple-policy";
12
+ version?: 1;
13
+ defaultMode?: ControlMode;
14
+ riskRules?: RipplePolicyRiskRule[];
15
+ };
16
+ export type LoadedRipplePolicy = {
17
+ policy: RipplePolicy;
18
+ path: string;
19
+ exists: boolean;
20
+ };
21
+ export type RipplePolicyResolution = {
22
+ source: "file" | "built-in";
23
+ sourcePath?: string;
24
+ defaultMode?: ControlMode;
25
+ risk?: ControlBoundaryRisk;
26
+ requireHumanBeforeEdit: boolean;
27
+ requireHumanBeforeMerge: boolean;
28
+ allowPrMode?: boolean;
29
+ matchedRules: string[];
30
+ };
31
+ export type RipplePolicyExplanation = {
32
+ protocol: "ripple-policy-explanation";
33
+ version: 1;
34
+ targetFile: string;
35
+ policySource: string;
36
+ policyExists: boolean;
37
+ effectiveMode: ControlMode;
38
+ policyRisk: ControlBoundaryRisk | "none";
39
+ humanGate: HumanGate;
40
+ humanRequired: boolean;
41
+ allowPrMode: boolean;
42
+ matchedRules: string[];
43
+ why: string[];
44
+ nextSteps: string[];
45
+ };
46
+ export type RipplePolicyExplanationOptions = {
47
+ controlMode?: ControlMode;
48
+ };
49
+ export declare function defaultRipplePolicy(): RipplePolicy;
50
+ export declare function formatRipplePolicy(policy?: RipplePolicy): string;
51
+ export declare function ripplePolicyPath(workspaceRoot: string): string;
52
+ export declare function loadRipplePolicy(workspaceRoot: string): LoadedRipplePolicy;
53
+ export declare function resolveRipplePolicyForTarget(loaded: LoadedRipplePolicy, targetFile: string): RipplePolicyResolution;
54
+ export declare function explainRipplePolicyForTarget(loaded: LoadedRipplePolicy, targetFile: string, options?: RipplePolicyExplanationOptions): RipplePolicyExplanation;
55
+ export declare function explainRipplePolicyForIntent(loaded: LoadedRipplePolicy, intent: ChangeIntent): RipplePolicyExplanation;