Problem: the hexagonal refactor churns the backend tree for nine more phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper, compose/web image) must move to its own repo first so doc/layout rewrites land once on a backend-only tree. Change: - New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/ (updateURL repointed to oikos-web releases), compose/, own CI (web + desktop jobs), own deploy script (CI-green gate, TOCTOU guard, version-tagged images, prune-to-3), own webhook receiver on :9798 + launchd unit, own compose project publishing the same 8091:80. - Cutover executed on mac-mini in order: oikos stack's web service stopped+removed, oikos-web project brought up on 8091; outer Caddy untouched (targets the published port) — serving + Authentik flow + /wails 404 quirk verified post-cutover. - Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install targets, the compose web service, oikos-web from deploy.sh's fallback prune list; wails + go-keyring dropped from go.mod, vendor synced. - README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now point at the new repo; mbse + mascot design docs carry a path note. Risk: production SPA serving depends on the new pipeline now; rollback is versioned-image re-up of the old web service from a pre-split checkout (port 8091). Desktop builds installed before the split still check dtoro/oikos releases — one manual reinstall, noted in the oikos-web release notes. Verification: go vet, make test (race), make generate-check, golangci (no new findings; baseline down 400→365); post-cutover curls — localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
145 lines
4.7 KiB
JavaScript
145 lines
4.7 KiB
JavaScript
// src/build-source-map-tree.ts
|
|
import { TraceMap } from "@jridgewell/trace-mapping";
|
|
|
|
// src/source-map-tree.ts
|
|
import { GenMapping, maybeAddSegment, setIgnore, setSourceContent } from "@jridgewell/gen-mapping";
|
|
import { traceSegment, decodedMappings } from "@jridgewell/trace-mapping";
|
|
var SOURCELESS_MAPPING = /* @__PURE__ */ SegmentObject("", -1, -1, "", null, false);
|
|
var EMPTY_SOURCES = [];
|
|
function SegmentObject(source, line, column, name, content, ignore) {
|
|
return { source, line, column, name, content, ignore };
|
|
}
|
|
function Source(map, sources, source, content, ignore) {
|
|
return {
|
|
map,
|
|
sources,
|
|
source,
|
|
content,
|
|
ignore
|
|
};
|
|
}
|
|
function MapSource(map, sources) {
|
|
return Source(map, sources, "", null, false);
|
|
}
|
|
function OriginalSource(source, content, ignore) {
|
|
return Source(null, EMPTY_SOURCES, source, content, ignore);
|
|
}
|
|
function traceMappings(tree) {
|
|
const gen = new GenMapping({ file: tree.map.file });
|
|
const { sources: rootSources, map } = tree;
|
|
const rootNames = map.names;
|
|
const rootMappings = decodedMappings(map);
|
|
for (let i = 0; i < rootMappings.length; i++) {
|
|
const segments = rootMappings[i];
|
|
for (let j = 0; j < segments.length; j++) {
|
|
const segment = segments[j];
|
|
const genCol = segment[0];
|
|
let traced = SOURCELESS_MAPPING;
|
|
if (segment.length !== 1) {
|
|
const source2 = rootSources[segment[1]];
|
|
traced = originalPositionFor(
|
|
source2,
|
|
segment[2],
|
|
segment[3],
|
|
segment.length === 5 ? rootNames[segment[4]] : ""
|
|
);
|
|
if (traced == null) continue;
|
|
}
|
|
const { column, line, name, content, source, ignore } = traced;
|
|
maybeAddSegment(gen, i, genCol, source, line, column, name);
|
|
if (source && content != null) setSourceContent(gen, source, content);
|
|
if (ignore) setIgnore(gen, source, true);
|
|
}
|
|
}
|
|
return gen;
|
|
}
|
|
function originalPositionFor(source, line, column, name) {
|
|
if (!source.map) {
|
|
return SegmentObject(source.source, line, column, name, source.content, source.ignore);
|
|
}
|
|
const segment = traceSegment(source.map, line, column);
|
|
if (segment == null) return null;
|
|
if (segment.length === 1) return SOURCELESS_MAPPING;
|
|
return originalPositionFor(
|
|
source.sources[segment[1]],
|
|
segment[2],
|
|
segment[3],
|
|
segment.length === 5 ? source.map.names[segment[4]] : name
|
|
);
|
|
}
|
|
|
|
// src/build-source-map-tree.ts
|
|
function asArray(value) {
|
|
if (Array.isArray(value)) return value;
|
|
return [value];
|
|
}
|
|
function buildSourceMapTree(input, loader) {
|
|
const maps = asArray(input).map((m) => new TraceMap(m, ""));
|
|
const map = maps.pop();
|
|
for (let i = 0; i < maps.length; i++) {
|
|
if (maps[i].sources.length > 1) {
|
|
throw new Error(
|
|
`Transformation map ${i} must have exactly one source file.
|
|
Did you specify these with the most recent transformation maps first?`
|
|
);
|
|
}
|
|
}
|
|
let tree = build(map, loader, "", 0);
|
|
for (let i = maps.length - 1; i >= 0; i--) {
|
|
tree = MapSource(maps[i], [tree]);
|
|
}
|
|
return tree;
|
|
}
|
|
function build(map, loader, importer, importerDepth) {
|
|
const { resolvedSources, sourcesContent, ignoreList } = map;
|
|
const depth = importerDepth + 1;
|
|
const children = resolvedSources.map((sourceFile, i) => {
|
|
const ctx = {
|
|
importer,
|
|
depth,
|
|
source: sourceFile || "",
|
|
content: void 0,
|
|
ignore: void 0
|
|
};
|
|
const sourceMap = loader(ctx.source, ctx);
|
|
const { source, content, ignore } = ctx;
|
|
if (sourceMap) return build(new TraceMap(sourceMap, source), loader, source, depth);
|
|
const sourceContent = content !== void 0 ? content : sourcesContent ? sourcesContent[i] : null;
|
|
const ignored = ignore !== void 0 ? ignore : ignoreList ? ignoreList.includes(i) : false;
|
|
return OriginalSource(source, sourceContent, ignored);
|
|
});
|
|
return MapSource(map, children);
|
|
}
|
|
|
|
// src/source-map.ts
|
|
import { toDecodedMap, toEncodedMap } from "@jridgewell/gen-mapping";
|
|
var SourceMap = class {
|
|
constructor(map, options) {
|
|
const out = options.decodedMappings ? toDecodedMap(map) : toEncodedMap(map);
|
|
this.version = out.version;
|
|
this.file = out.file;
|
|
this.mappings = out.mappings;
|
|
this.names = out.names;
|
|
this.ignoreList = out.ignoreList;
|
|
this.sourceRoot = out.sourceRoot;
|
|
this.sources = out.sources;
|
|
if (!options.excludeContent) {
|
|
this.sourcesContent = out.sourcesContent;
|
|
}
|
|
}
|
|
toString() {
|
|
return JSON.stringify(this);
|
|
}
|
|
};
|
|
|
|
// src/remapping.ts
|
|
function remapping(input, loader, options) {
|
|
const opts = typeof options === "object" ? options : { excludeContent: !!options, decodedMappings: false };
|
|
const tree = buildSourceMapTree(input, loader);
|
|
return new SourceMap(traceMappings(tree), opts);
|
|
}
|
|
export {
|
|
remapping as default
|
|
};
|
|
//# sourceMappingURL=remapping.mjs.map
|