Convert the bundled backend/internal/plugins/smartblock package into a standalone reactor-mode wasm plugin: - package smartblock -> package main; add wasip1 main.go with wasmguest.Serve(Registration). - Add go.mod (module git.dev.alexdunmow.com/block/smartblock) pinning block/core v0.18.2; no replace directives. - Flesh out plugin.mod (scope=ninja, kind=plugin, categories, tags, display_name, description). - Point web/eslint.config.js at ../../../cms/web/eslint.config.js and switch @block-ninja/ui from workspace:* to the ^0.1.0 registry version; rebuild web/dist. - Add .gitignore (*.bnp, *.wasm, web/node_modules). Behavior unchanged: registers the "smart" block; assets served from web/dist. Builds to smartblock-1.0.0.bnp; check-safety passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
393 lines
13 KiB
JavaScript
393 lines
13 KiB
JavaScript
const buildIdentifier = "[0-9A-Za-z-]+";
|
|
const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`;
|
|
const numericIdentifier = "0|[1-9]\\d*";
|
|
const numericIdentifierLoose = "[0-9]+";
|
|
const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*";
|
|
const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`;
|
|
const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`;
|
|
const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`;
|
|
const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`;
|
|
const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`;
|
|
const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`;
|
|
const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`;
|
|
const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`;
|
|
const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`;
|
|
const gtlt = "((?:<|>)?=?)";
|
|
const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`;
|
|
const loneTilde = "(?:~>?)";
|
|
const tildeTrim = `(\\s*)${loneTilde}\\s+`;
|
|
const loneCaret = "(?:\\^)";
|
|
const caretTrim = `(\\s*)${loneCaret}\\s+`;
|
|
const star = "(<|>)?=?\\s*\\*";
|
|
const caret = `^${loneCaret}${xRangePlain}$`;
|
|
const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`;
|
|
const fullPlain = `v?${mainVersion}${preRelease}?${build}?`;
|
|
const tilde = `^${loneTilde}${xRangePlain}$`;
|
|
const xRange = `^${gtlt}\\s*${xRangePlain}$`;
|
|
const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`;
|
|
const gte0 = "^\\s*>=\\s*0.0.0\\s*$";
|
|
function parseRegex(source) {
|
|
return new RegExp(source);
|
|
}
|
|
function isXVersion(version) {
|
|
return !version || version.toLowerCase() === "x" || version === "*";
|
|
}
|
|
function pipe(...fns) {
|
|
return (x) => {
|
|
return fns.reduce((v, f) => f(v), x);
|
|
};
|
|
}
|
|
function extractComparator(comparatorString) {
|
|
return comparatorString.match(parseRegex(comparator));
|
|
}
|
|
function combineVersion(major, minor, patch, preRelease2) {
|
|
const mainVersion2 = `${major}.${minor}.${patch}`;
|
|
if (preRelease2) {
|
|
return `${mainVersion2}-${preRelease2}`;
|
|
}
|
|
return mainVersion2;
|
|
}
|
|
function parseHyphen(range) {
|
|
return range.replace(parseRegex(hyphenRange), (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => {
|
|
if (isXVersion(fromMajor)) {
|
|
from = "";
|
|
} else if (isXVersion(fromMinor)) {
|
|
from = `>=${fromMajor}.0.0`;
|
|
} else if (isXVersion(fromPatch)) {
|
|
from = `>=${fromMajor}.${fromMinor}.0`;
|
|
} else {
|
|
from = `>=${from}`;
|
|
}
|
|
if (isXVersion(toMajor)) {
|
|
to = "";
|
|
} else if (isXVersion(toMinor)) {
|
|
to = `<${+toMajor + 1}.0.0-0`;
|
|
} else if (isXVersion(toPatch)) {
|
|
to = `<${toMajor}.${+toMinor + 1}.0-0`;
|
|
} else if (toPreRelease) {
|
|
to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`;
|
|
} else {
|
|
to = `<=${to}`;
|
|
}
|
|
return `${from} ${to}`.trim();
|
|
});
|
|
}
|
|
function parseComparatorTrim(range) {
|
|
return range.replace(parseRegex(comparatorTrim), "$1$2$3");
|
|
}
|
|
function parseTildeTrim(range) {
|
|
return range.replace(parseRegex(tildeTrim), "$1~");
|
|
}
|
|
function parseCaretTrim(range) {
|
|
return range.replace(parseRegex(caretTrim), "$1^");
|
|
}
|
|
function parseCarets(range) {
|
|
return range
|
|
.trim()
|
|
.split(/\s+/)
|
|
.map((rangeVersion) => {
|
|
return rangeVersion.replace(parseRegex(caret), (_, major, minor, patch, preRelease2) => {
|
|
if (isXVersion(major)) {
|
|
return "";
|
|
} else if (isXVersion(minor)) {
|
|
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
|
} else if (isXVersion(patch)) {
|
|
if (major === "0") {
|
|
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
|
} else {
|
|
return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`;
|
|
}
|
|
} else if (preRelease2) {
|
|
if (major === "0") {
|
|
if (minor === "0") {
|
|
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`;
|
|
} else {
|
|
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
|
}
|
|
} else {
|
|
return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`;
|
|
}
|
|
} else {
|
|
if (major === "0") {
|
|
if (minor === "0") {
|
|
return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`;
|
|
} else {
|
|
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
|
}
|
|
}
|
|
return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`;
|
|
}
|
|
});
|
|
})
|
|
.join(" ");
|
|
}
|
|
function parseTildes(range) {
|
|
return range
|
|
.trim()
|
|
.split(/\s+/)
|
|
.map((rangeVersion) => {
|
|
return rangeVersion.replace(parseRegex(tilde), (_, major, minor, patch, preRelease2) => {
|
|
if (isXVersion(major)) {
|
|
return "";
|
|
} else if (isXVersion(minor)) {
|
|
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
|
} else if (isXVersion(patch)) {
|
|
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
|
} else if (preRelease2) {
|
|
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
|
}
|
|
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
|
});
|
|
})
|
|
.join(" ");
|
|
}
|
|
function parseXRanges(range) {
|
|
return range
|
|
.split(/\s+/)
|
|
.map((rangeVersion) => {
|
|
return rangeVersion.trim().replace(parseRegex(xRange), (ret, gtlt2, major, minor, patch, preRelease2) => {
|
|
const isXMajor = isXVersion(major);
|
|
const isXMinor = isXMajor || isXVersion(minor);
|
|
const isXPatch = isXMinor || isXVersion(patch);
|
|
if (gtlt2 === "=" && isXPatch) {
|
|
gtlt2 = "";
|
|
}
|
|
preRelease2 = "";
|
|
if (isXMajor) {
|
|
if (gtlt2 === ">" || gtlt2 === "<") {
|
|
return "<0.0.0-0";
|
|
} else {
|
|
return "*";
|
|
}
|
|
} else if (gtlt2 && isXPatch) {
|
|
if (isXMinor) {
|
|
minor = 0;
|
|
}
|
|
patch = 0;
|
|
if (gtlt2 === ">") {
|
|
gtlt2 = ">=";
|
|
if (isXMinor) {
|
|
major = +major + 1;
|
|
minor = 0;
|
|
patch = 0;
|
|
} else {
|
|
minor = +minor + 1;
|
|
patch = 0;
|
|
}
|
|
} else if (gtlt2 === "<=") {
|
|
gtlt2 = "<";
|
|
if (isXMinor) {
|
|
major = +major + 1;
|
|
} else {
|
|
minor = +minor + 1;
|
|
}
|
|
}
|
|
if (gtlt2 === "<") {
|
|
preRelease2 = "-0";
|
|
}
|
|
return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`;
|
|
} else if (isXMinor) {
|
|
return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`;
|
|
} else if (isXPatch) {
|
|
return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`;
|
|
}
|
|
return ret;
|
|
});
|
|
})
|
|
.join(" ");
|
|
}
|
|
function parseStar(range) {
|
|
return range.trim().replace(parseRegex(star), "");
|
|
}
|
|
function parseGTE0(comparatorString) {
|
|
return comparatorString.trim().replace(parseRegex(gte0), "");
|
|
}
|
|
function compareAtom(rangeAtom, versionAtom) {
|
|
rangeAtom = +rangeAtom || rangeAtom;
|
|
versionAtom = +versionAtom || versionAtom;
|
|
if (rangeAtom > versionAtom) {
|
|
return 1;
|
|
}
|
|
if (rangeAtom === versionAtom) {
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
function comparePreRelease(rangeAtom, versionAtom) {
|
|
const { preRelease: rangePreRelease } = rangeAtom;
|
|
const { preRelease: versionPreRelease } = versionAtom;
|
|
if (rangePreRelease === void 0 && !!versionPreRelease) {
|
|
return 1;
|
|
}
|
|
if (!!rangePreRelease && versionPreRelease === void 0) {
|
|
return -1;
|
|
}
|
|
if (rangePreRelease === void 0 && versionPreRelease === void 0) {
|
|
return 0;
|
|
}
|
|
for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
|
|
const rangeElement = rangePreRelease[i];
|
|
const versionElement = versionPreRelease[i];
|
|
if (rangeElement === versionElement) {
|
|
continue;
|
|
}
|
|
if (rangeElement === void 0 && versionElement === void 0) {
|
|
return 0;
|
|
}
|
|
if (!rangeElement) {
|
|
return 1;
|
|
}
|
|
if (!versionElement) {
|
|
return -1;
|
|
}
|
|
return compareAtom(rangeElement, versionElement);
|
|
}
|
|
return 0;
|
|
}
|
|
function compareVersion(rangeAtom, versionAtom) {
|
|
return (
|
|
compareAtom(rangeAtom.major, versionAtom.major) ||
|
|
compareAtom(rangeAtom.minor, versionAtom.minor) ||
|
|
compareAtom(rangeAtom.patch, versionAtom.patch) ||
|
|
comparePreRelease(rangeAtom, versionAtom)
|
|
);
|
|
}
|
|
function eq(rangeAtom, versionAtom) {
|
|
return rangeAtom.version === versionAtom.version;
|
|
}
|
|
function compare(rangeAtom, versionAtom) {
|
|
switch (rangeAtom.operator) {
|
|
case "":
|
|
case "=":
|
|
return eq(rangeAtom, versionAtom);
|
|
case ">":
|
|
return compareVersion(rangeAtom, versionAtom) < 0;
|
|
case ">=":
|
|
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
|
|
case "<":
|
|
return compareVersion(rangeAtom, versionAtom) > 0;
|
|
case "<=":
|
|
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
|
|
case void 0: {
|
|
return true;
|
|
}
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
function parseComparatorString(range) {
|
|
return pipe(parseCarets, parseTildes, parseXRanges, parseStar)(range);
|
|
}
|
|
function parseRange(range) {
|
|
return pipe(parseHyphen, parseComparatorTrim, parseTildeTrim, parseCaretTrim)(range.trim()).split(/\s+/).join(" ");
|
|
}
|
|
function satisfy(version, range) {
|
|
if (!version) {
|
|
return false;
|
|
}
|
|
const parsedRange = parseRange(range);
|
|
const parsedComparator = parsedRange
|
|
.split(" ")
|
|
.map((rangeVersion) => parseComparatorString(rangeVersion))
|
|
.join(" ");
|
|
const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2));
|
|
const extractedVersion = extractComparator(version);
|
|
if (!extractedVersion) {
|
|
return false;
|
|
}
|
|
const [, versionOperator, , versionMajor, versionMinor, versionPatch, versionPreRelease] = extractedVersion;
|
|
const versionAtom = {
|
|
version: combineVersion(versionMajor, versionMinor, versionPatch, versionPreRelease),
|
|
major: versionMajor,
|
|
minor: versionMinor,
|
|
patch: versionPatch,
|
|
preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split("."),
|
|
};
|
|
for (const comparator2 of comparators) {
|
|
const extractedComparator = extractComparator(comparator2);
|
|
if (!extractedComparator) {
|
|
return false;
|
|
}
|
|
const [, rangeOperator, , rangeMajor, rangeMinor, rangePatch, rangePreRelease] = extractedComparator;
|
|
const rangeAtom = {
|
|
operator: rangeOperator,
|
|
version: combineVersion(rangeMajor, rangeMinor, rangePatch, rangePreRelease),
|
|
major: rangeMajor,
|
|
minor: rangeMinor,
|
|
patch: rangePatch,
|
|
preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split("."),
|
|
};
|
|
if (!compare(rangeAtom, versionAtom)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
const currentImports = {};
|
|
|
|
// eslint-disable-next-line no-undef
|
|
const moduleMap = {
|
|
"react": { get: () => () => __federation_import(new URL("__federation_shared_react-DoKb58Ht.js", import.meta.url).href), import: true },
|
|
"react-dom": { get: () => () => __federation_import(new URL("__federation_shared_react-dom-DU2-P0kt.js", import.meta.url).href), import: true },
|
|
"@block-ninja/ui": { get: () => () => __federation_import(new URL("__federation_shared_@block-ninja/ui-C3CAr7wz.js", import.meta.url).href), import: true },
|
|
};
|
|
const moduleCache = Object.create(null);
|
|
async function importShared(name, shareScope = "default") {
|
|
return moduleCache[name] ? new Promise((r) => r(moduleCache[name])) : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name);
|
|
}
|
|
// eslint-disable-next-line
|
|
async function __federation_import(name) {
|
|
currentImports[name] ??= import(name);
|
|
return currentImports[name];
|
|
}
|
|
async function getSharedFromRuntime(name, shareScope) {
|
|
let module = null;
|
|
if (globalThis?.__federation_shared__?.[shareScope]?.[name]) {
|
|
const versionObj = globalThis.__federation_shared__[shareScope][name];
|
|
const requiredVersion = moduleMap[name]?.requiredVersion;
|
|
const hasRequiredVersion = !!requiredVersion;
|
|
if (hasRequiredVersion) {
|
|
const versionKey = Object.keys(versionObj).find((version) => satisfy(version, requiredVersion));
|
|
if (versionKey) {
|
|
const versionValue = versionObj[versionKey];
|
|
module = await (await versionValue.get())();
|
|
} else {
|
|
console.log(`provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})`);
|
|
}
|
|
} else {
|
|
const versionKey = Object.keys(versionObj)[0];
|
|
const versionValue = versionObj[versionKey];
|
|
module = await (await versionValue.get())();
|
|
}
|
|
}
|
|
if (module) {
|
|
return flattenModule(module, name);
|
|
}
|
|
}
|
|
async function getSharedFromLocal(name) {
|
|
if (moduleMap[name]?.import) {
|
|
let module = await (await moduleMap[name].get())();
|
|
return flattenModule(module, name);
|
|
} else {
|
|
console.error(`consumer config import=false,so cant use callback shared module`);
|
|
}
|
|
}
|
|
function flattenModule(module, name) {
|
|
// use a shared module which export default a function will getting error 'TypeError: xxx is not a function'
|
|
if (typeof module.default === "function") {
|
|
Object.keys(module).forEach((key) => {
|
|
if (key !== "default") {
|
|
module.default[key] = module[key];
|
|
}
|
|
});
|
|
moduleCache[name] = module.default;
|
|
return module.default;
|
|
}
|
|
if (module.default) module = Object.assign({}, module.default, module);
|
|
moduleCache[name] = module;
|
|
return module;
|
|
}
|
|
|
|
export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime };
|