@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.
- package/CHANGELOG.md +18 -0
- package/README.md +53 -0
- package/dist/adapters.d.ts +39 -0
- package/dist/adapters.js +396 -0
- package/dist/adapters.js.map +1 -0
- package/dist/agent-workflow.d.ts +86 -0
- package/dist/agent-workflow.js +404 -0
- package/dist/agent-workflow.js.map +1 -0
- package/dist/approval.d.ts +45 -0
- package/dist/approval.js +272 -0
- package/dist/approval.js.map +1 -0
- package/dist/audit.d.ts +80 -0
- package/dist/audit.js +271 -0
- package/dist/audit.js.map +1 -0
- package/dist/change-intent.d.ts +242 -0
- package/dist/change-intent.js +1758 -0
- package/dist/change-intent.js.map +1 -0
- package/dist/graph.d.ts +346 -0
- package/dist/graph.js +4221 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/normalizer.d.ts +34 -0
- package/dist/normalizer.js +455 -0
- package/dist/normalizer.js.map +1 -0
- package/dist/policy.d.ts +55 -0
- package/dist/policy.js +380 -0
- package/dist/policy.js.map +1 -0
- package/dist/readiness.d.ts +35 -0
- package/dist/readiness.js +200 -0
- package/dist/readiness.js.map +1 -0
- package/dist/staged-check.d.ts +96 -0
- package/dist/staged-check.js +853 -0
- package/dist/staged-check.js.map +1 -0
- package/dist/types.d.ts +122 -0
- package/dist/types.js +71 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -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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"}
|
package/dist/policy.d.ts
ADDED
|
@@ -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;
|