forked from FINAKON/HelpProject
1. Initial Commit - a boiler plate code and POC to realize the concept of context sensitive help 2. Frontend code written in ReactJS 3. Backend code written in Java, Spring Boot Framework 4. Frontend Start: pre-requisites : node, npm npm run dev ==> to start the frontend vite server 5. Backend Start: pre-requisites : java, mvn mvn spring-boot:run ==> to start the backend server 6. Visit http://localhost:5173/ for basic demo of help, press F1 in textboxes 7. Visit http://localhost:5173/editor and enter "admin123" to add/modify texts. Happy Coding !!! Thank you, Bhargava.
365 lines
13 KiB
JavaScript
365 lines
13 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = normalizeModuleAndLoadMetadata;
|
|
exports.hasExports = hasExports;
|
|
exports.isSideEffectImport = isSideEffectImport;
|
|
exports.validateImportInteropOption = validateImportInteropOption;
|
|
var _path = require("path");
|
|
var _helperValidatorIdentifier = require("@babel/helper-validator-identifier");
|
|
function hasExports(metadata) {
|
|
return metadata.hasExports;
|
|
}
|
|
function isSideEffectImport(source) {
|
|
return source.imports.size === 0 && source.importsNamespace.size === 0 && source.reexports.size === 0 && source.reexportNamespace.size === 0 && !source.reexportAll;
|
|
}
|
|
function validateImportInteropOption(importInterop) {
|
|
if (typeof importInterop !== "function" && importInterop !== "none" && importInterop !== "babel" && importInterop !== "node") {
|
|
throw new Error(`.importInterop must be one of "none", "babel", "node", or a function returning one of those values (received ${importInterop}).`);
|
|
}
|
|
return importInterop;
|
|
}
|
|
function resolveImportInterop(importInterop, source, filename) {
|
|
if (typeof importInterop === "function") {
|
|
return validateImportInteropOption(importInterop(source, filename));
|
|
}
|
|
return importInterop;
|
|
}
|
|
function normalizeModuleAndLoadMetadata(programPath, exportName, {
|
|
importInterop,
|
|
initializeReexports = false,
|
|
getWrapperPayload,
|
|
esNamespaceOnly = false,
|
|
filename
|
|
}) {
|
|
if (!exportName) {
|
|
exportName = programPath.scope.generateUidIdentifier("exports").name;
|
|
}
|
|
const stringSpecifiers = new Set();
|
|
nameAnonymousExports(programPath);
|
|
const {
|
|
local,
|
|
sources,
|
|
hasExports
|
|
} = getModuleMetadata(programPath, {
|
|
initializeReexports,
|
|
getWrapperPayload
|
|
}, stringSpecifiers);
|
|
removeImportExportDeclarations(programPath);
|
|
for (const [source, metadata] of sources) {
|
|
const {
|
|
importsNamespace,
|
|
imports
|
|
} = metadata;
|
|
if (importsNamespace.size > 0 && imports.size === 0) {
|
|
const [nameOfnamespace] = importsNamespace;
|
|
metadata.name = nameOfnamespace;
|
|
}
|
|
const resolvedInterop = resolveImportInterop(importInterop, source, filename);
|
|
if (resolvedInterop === "none") {
|
|
metadata.interop = "none";
|
|
} else if (resolvedInterop === "node" && metadata.interop === "namespace") {
|
|
metadata.interop = "node-namespace";
|
|
} else if (resolvedInterop === "node" && metadata.interop === "default") {
|
|
metadata.interop = "node-default";
|
|
} else if (esNamespaceOnly && metadata.interop === "namespace") {
|
|
metadata.interop = "default";
|
|
}
|
|
}
|
|
return {
|
|
exportName,
|
|
exportNameListName: null,
|
|
hasExports,
|
|
local,
|
|
source: sources,
|
|
stringSpecifiers
|
|
};
|
|
}
|
|
function getExportSpecifierName(path, stringSpecifiers) {
|
|
if (path.isIdentifier()) {
|
|
return path.node.name;
|
|
} else if (path.isStringLiteral()) {
|
|
const stringValue = path.node.value;
|
|
if (!(0, _helperValidatorIdentifier.isIdentifierName)(stringValue)) {
|
|
stringSpecifiers.add(stringValue);
|
|
}
|
|
return stringValue;
|
|
} else {
|
|
throw new Error(`Expected export specifier to be either Identifier or StringLiteral, got ${path.node.type}`);
|
|
}
|
|
}
|
|
function assertExportSpecifier(path) {
|
|
if (path.isExportSpecifier()) {
|
|
return;
|
|
} else if (path.isExportNamespaceSpecifier()) {
|
|
throw path.buildCodeFrameError("Export namespace should be first transformed by `@babel/plugin-transform-export-namespace-from`.");
|
|
} else {
|
|
throw path.buildCodeFrameError("Unexpected export specifier type");
|
|
}
|
|
}
|
|
function getModuleMetadata(programPath, {
|
|
getWrapperPayload,
|
|
initializeReexports
|
|
}, stringSpecifiers) {
|
|
const localData = getLocalExportMetadata(programPath, initializeReexports, stringSpecifiers);
|
|
const importNodes = new Map();
|
|
const sourceData = new Map();
|
|
const getData = (sourceNode, node) => {
|
|
const source = sourceNode.value;
|
|
let data = sourceData.get(source);
|
|
if (!data) {
|
|
data = {
|
|
name: programPath.scope.generateUidIdentifier((0, _path.basename)(source, (0, _path.extname)(source))).name,
|
|
interop: "none",
|
|
loc: null,
|
|
imports: new Map(),
|
|
importsNamespace: new Set(),
|
|
reexports: new Map(),
|
|
reexportNamespace: new Set(),
|
|
reexportAll: null,
|
|
wrap: null,
|
|
get lazy() {
|
|
return this.wrap === "lazy";
|
|
},
|
|
referenced: false
|
|
};
|
|
sourceData.set(source, data);
|
|
importNodes.set(source, [node]);
|
|
} else {
|
|
importNodes.get(source).push(node);
|
|
}
|
|
return data;
|
|
};
|
|
let hasExports = false;
|
|
programPath.get("body").forEach(child => {
|
|
if (child.isImportDeclaration()) {
|
|
const data = getData(child.node.source, child.node);
|
|
if (!data.loc) data.loc = child.node.loc;
|
|
child.get("specifiers").forEach(spec => {
|
|
if (spec.isImportDefaultSpecifier()) {
|
|
const localName = spec.get("local").node.name;
|
|
data.imports.set(localName, "default");
|
|
const reexport = localData.get(localName);
|
|
if (reexport) {
|
|
localData.delete(localName);
|
|
reexport.names.forEach(name => {
|
|
data.reexports.set(name, "default");
|
|
});
|
|
data.referenced = true;
|
|
}
|
|
} else if (spec.isImportNamespaceSpecifier()) {
|
|
const localName = spec.get("local").node.name;
|
|
data.importsNamespace.add(localName);
|
|
const reexport = localData.get(localName);
|
|
if (reexport) {
|
|
localData.delete(localName);
|
|
reexport.names.forEach(name => {
|
|
data.reexportNamespace.add(name);
|
|
});
|
|
data.referenced = true;
|
|
}
|
|
} else if (spec.isImportSpecifier()) {
|
|
const importName = getExportSpecifierName(spec.get("imported"), stringSpecifiers);
|
|
const localName = spec.get("local").node.name;
|
|
data.imports.set(localName, importName);
|
|
const reexport = localData.get(localName);
|
|
if (reexport) {
|
|
localData.delete(localName);
|
|
reexport.names.forEach(name => {
|
|
data.reexports.set(name, importName);
|
|
});
|
|
data.referenced = true;
|
|
}
|
|
}
|
|
});
|
|
} else if (child.isExportAllDeclaration()) {
|
|
hasExports = true;
|
|
const data = getData(child.node.source, child.node);
|
|
if (!data.loc) data.loc = child.node.loc;
|
|
data.reexportAll = {
|
|
loc: child.node.loc
|
|
};
|
|
data.referenced = true;
|
|
} else if (child.isExportNamedDeclaration() && child.node.source) {
|
|
hasExports = true;
|
|
const data = getData(child.node.source, child.node);
|
|
if (!data.loc) data.loc = child.node.loc;
|
|
child.get("specifiers").forEach(spec => {
|
|
assertExportSpecifier(spec);
|
|
const importName = getExportSpecifierName(spec.get("local"), stringSpecifiers);
|
|
const exportName = getExportSpecifierName(spec.get("exported"), stringSpecifiers);
|
|
data.reexports.set(exportName, importName);
|
|
data.referenced = true;
|
|
if (exportName === "__esModule") {
|
|
throw spec.get("exported").buildCodeFrameError('Illegal export "__esModule".');
|
|
}
|
|
});
|
|
} else if (child.isExportNamedDeclaration() || child.isExportDefaultDeclaration()) {
|
|
hasExports = true;
|
|
}
|
|
});
|
|
for (const metadata of sourceData.values()) {
|
|
let needsDefault = false;
|
|
let needsNamed = false;
|
|
if (metadata.importsNamespace.size > 0) {
|
|
needsDefault = true;
|
|
needsNamed = true;
|
|
}
|
|
if (metadata.reexportAll) {
|
|
needsNamed = true;
|
|
}
|
|
for (const importName of metadata.imports.values()) {
|
|
if (importName === "default") needsDefault = true;else needsNamed = true;
|
|
}
|
|
for (const importName of metadata.reexports.values()) {
|
|
if (importName === "default") needsDefault = true;else needsNamed = true;
|
|
}
|
|
if (needsDefault && needsNamed) {
|
|
metadata.interop = "namespace";
|
|
} else if (needsDefault) {
|
|
metadata.interop = "default";
|
|
}
|
|
}
|
|
if (getWrapperPayload) {
|
|
for (const [source, metadata] of sourceData) {
|
|
metadata.wrap = getWrapperPayload(source, metadata, importNodes.get(source));
|
|
}
|
|
}
|
|
return {
|
|
hasExports,
|
|
local: localData,
|
|
sources: sourceData
|
|
};
|
|
}
|
|
function getLocalExportMetadata(programPath, initializeReexports, stringSpecifiers) {
|
|
const bindingKindLookup = new Map();
|
|
const programScope = programPath.scope;
|
|
const programChildren = programPath.get("body");
|
|
programChildren.forEach(child => {
|
|
let kind;
|
|
if (child.isImportDeclaration()) {
|
|
kind = "import";
|
|
} else {
|
|
if (child.isExportDefaultDeclaration()) {
|
|
child = child.get("declaration");
|
|
}
|
|
if (child.isExportNamedDeclaration()) {
|
|
if (child.node.declaration) {
|
|
child = child.get("declaration");
|
|
} else if (initializeReexports && child.node.source && child.get("source").isStringLiteral()) {
|
|
child.get("specifiers").forEach(spec => {
|
|
assertExportSpecifier(spec);
|
|
bindingKindLookup.set(spec.get("local").node.name, "block");
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
if (child.isFunctionDeclaration()) {
|
|
kind = "hoisted";
|
|
} else if (child.isClassDeclaration()) {
|
|
kind = "block";
|
|
} else if (child.isVariableDeclaration({
|
|
kind: "var"
|
|
})) {
|
|
kind = "var";
|
|
} else if (child.isVariableDeclaration()) {
|
|
kind = "block";
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
Object.keys(child.getOuterBindingIdentifiers()).forEach(name => {
|
|
bindingKindLookup.set(name, kind);
|
|
});
|
|
});
|
|
const localMetadata = new Map();
|
|
const getLocalMetadata = idPath => {
|
|
const localName = idPath.node.name;
|
|
let metadata = localMetadata.get(localName);
|
|
if (!metadata) {
|
|
var _bindingKindLookup$ge, _programScope$getBind;
|
|
const kind = (_bindingKindLookup$ge = bindingKindLookup.get(localName)) != null ? _bindingKindLookup$ge : (_programScope$getBind = programScope.getBinding(localName)) == null ? void 0 : _programScope$getBind.kind;
|
|
if (kind === undefined) {
|
|
throw idPath.buildCodeFrameError(`Exporting local "${localName}", which is not declared.`);
|
|
}
|
|
metadata = {
|
|
names: [],
|
|
kind
|
|
};
|
|
localMetadata.set(localName, metadata);
|
|
}
|
|
return metadata;
|
|
};
|
|
programChildren.forEach(child => {
|
|
if (child.isExportNamedDeclaration() && (initializeReexports || !child.node.source)) {
|
|
if (child.node.declaration) {
|
|
const declaration = child.get("declaration");
|
|
const ids = declaration.getOuterBindingIdentifierPaths();
|
|
Object.keys(ids).forEach(name => {
|
|
if (name === "__esModule") {
|
|
throw declaration.buildCodeFrameError('Illegal export "__esModule".');
|
|
}
|
|
getLocalMetadata(ids[name]).names.push(name);
|
|
});
|
|
} else {
|
|
child.get("specifiers").forEach(spec => {
|
|
const local = spec.get("local");
|
|
const exported = spec.get("exported");
|
|
const localMetadata = getLocalMetadata(local);
|
|
const exportName = getExportSpecifierName(exported, stringSpecifiers);
|
|
if (exportName === "__esModule") {
|
|
throw exported.buildCodeFrameError('Illegal export "__esModule".');
|
|
}
|
|
localMetadata.names.push(exportName);
|
|
});
|
|
}
|
|
} else if (child.isExportDefaultDeclaration()) {
|
|
const declaration = child.get("declaration");
|
|
if (declaration.isFunctionDeclaration() || declaration.isClassDeclaration()) {
|
|
getLocalMetadata(declaration.get("id")).names.push("default");
|
|
} else {
|
|
throw declaration.buildCodeFrameError("Unexpected default expression export.");
|
|
}
|
|
}
|
|
});
|
|
return localMetadata;
|
|
}
|
|
function nameAnonymousExports(programPath) {
|
|
programPath.get("body").forEach(child => {
|
|
if (!child.isExportDefaultDeclaration()) return;
|
|
{
|
|
var _child$splitExportDec;
|
|
(_child$splitExportDec = child.splitExportDeclaration) != null ? _child$splitExportDec : child.splitExportDeclaration = require("@babel/traverse").NodePath.prototype.splitExportDeclaration;
|
|
}
|
|
child.splitExportDeclaration();
|
|
});
|
|
}
|
|
function removeImportExportDeclarations(programPath) {
|
|
programPath.get("body").forEach(child => {
|
|
if (child.isImportDeclaration()) {
|
|
child.remove();
|
|
} else if (child.isExportNamedDeclaration()) {
|
|
if (child.node.declaration) {
|
|
child.node.declaration._blockHoist = child.node._blockHoist;
|
|
child.replaceWith(child.node.declaration);
|
|
} else {
|
|
child.remove();
|
|
}
|
|
} else if (child.isExportDefaultDeclaration()) {
|
|
const declaration = child.get("declaration");
|
|
if (declaration.isFunctionDeclaration() || declaration.isClassDeclaration()) {
|
|
declaration._blockHoist = child.node._blockHoist;
|
|
child.replaceWith(declaration);
|
|
} else {
|
|
throw declaration.buildCodeFrameError("Unexpected default expression export.");
|
|
}
|
|
} else if (child.isExportAllDeclaration()) {
|
|
child.remove();
|
|
}
|
|
});
|
|
}
|
|
|
|
//# sourceMappingURL=normalize-and-load-metadata.js.map
|