silgi 0.36.17 → 0.37.0
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/dist/build.mjs +1 -0
- package/dist/cli/build.mjs +79 -49
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/init.mjs +1 -0
- package/dist/cli/install.mjs +1 -0
- package/dist/cli/watch.mjs +1 -0
- package/package.json +2 -1
package/dist/build.mjs
CHANGED
package/dist/cli/build.mjs
CHANGED
|
@@ -16,8 +16,9 @@ import { fileURLToPath } from 'node:url';
|
|
|
16
16
|
import { defu } from 'defu';
|
|
17
17
|
import { resolveModuleURL } from 'exsolve';
|
|
18
18
|
import { withTrailingSlash, isRelative } from 'ufo';
|
|
19
|
-
import {
|
|
19
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
20
20
|
import { globby } from 'globby';
|
|
21
|
+
import { parseAsync } from 'oxc-parser';
|
|
21
22
|
import ignore from 'ignore';
|
|
22
23
|
import { klona } from 'klona';
|
|
23
24
|
import { useSilgiRuntimeConfig, initRuntimeConfig } from 'silgi/runtime';
|
|
@@ -574,44 +575,22 @@ function resolveGroupSyntax(group) {
|
|
|
574
575
|
return groups;
|
|
575
576
|
}
|
|
576
577
|
|
|
577
|
-
const TYPE_DECLARATION_EXPORT_REGEX = /\bexport\s+(?<declaration>(interface|type|declare (async function|function|let|const enum|const|enum|var|class)))\s+(?<name>[\w$]+)(?:\s+extends\s+(?<extends>[\w$, \t\n\r]+))?/g;
|
|
578
|
-
const FUNCTION_VARIABLE_EXPORT_REGEX = /\bexport\s+(?:const|let|var)\s+(?<name>[\w$]+)\s*=\s*(?<funcName>\w+)\s*\(/g;
|
|
579
|
-
function extractExportMatches(regex, fileContent, additionalMetadata = {}) {
|
|
580
|
-
const matchedExports = [];
|
|
581
|
-
for (const match of fileContent.matchAll(regex)) {
|
|
582
|
-
const name = match.groups?.name || "";
|
|
583
|
-
const declaration = match.groups?.declaration || "";
|
|
584
|
-
const funcName = match.groups?.funcName || "";
|
|
585
|
-
const extendsClause = match.groups?.extends || "";
|
|
586
|
-
const codeSnippet = funcName ? `export const ${name} = ${funcName}(` : `export ${declaration} ${name}`;
|
|
587
|
-
const extendedTypes = extendsClause ? extendsClause.split(",").map((typeName) => typeName.trim()) : [];
|
|
588
|
-
matchedExports.push({
|
|
589
|
-
...additionalMetadata,
|
|
590
|
-
name,
|
|
591
|
-
declaration,
|
|
592
|
-
funcName,
|
|
593
|
-
code: codeSnippet,
|
|
594
|
-
start: match.index,
|
|
595
|
-
end: (match.index || 0) + match[0].length,
|
|
596
|
-
extends: extendedTypes
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
return matchedExports;
|
|
600
|
-
}
|
|
601
578
|
function generateUniqueIdentifier(filePath, exportName) {
|
|
602
579
|
const fileBaseName = basename(filePath);
|
|
603
580
|
const uniqueString = `${fileBaseName}${exportName}`;
|
|
604
581
|
return hash(uniqueString);
|
|
605
582
|
}
|
|
606
|
-
function categorizeExports(exportedEntities, filePath
|
|
583
|
+
function categorizeExports(exportedEntities, filePath, functionExportCategories = {
|
|
584
|
+
createService: "service",
|
|
585
|
+
createSchema: "schema",
|
|
586
|
+
createShared: "shared",
|
|
587
|
+
createRoute: "route"
|
|
588
|
+
}, interfaceExportCategories = {
|
|
589
|
+
ExtendShared: "shared",
|
|
590
|
+
ExtendContext: "context"
|
|
591
|
+
}) {
|
|
607
592
|
const runtimeExports = [];
|
|
608
593
|
const typeExports = [];
|
|
609
|
-
const functionExportCategories = {
|
|
610
|
-
createService: "service",
|
|
611
|
-
createSchema: "schema",
|
|
612
|
-
createShared: "shared",
|
|
613
|
-
createRoute: "route"
|
|
614
|
-
};
|
|
615
594
|
for (const [functionName, category] of Object.entries(functionExportCategories)) {
|
|
616
595
|
const matchingExports = exportedEntities.filter((entity) => entity.funcName === functionName);
|
|
617
596
|
for (const exportEntity of matchingExports) {
|
|
@@ -625,10 +604,6 @@ function categorizeExports(exportedEntities, filePath) {
|
|
|
625
604
|
});
|
|
626
605
|
}
|
|
627
606
|
}
|
|
628
|
-
const interfaceExportCategories = {
|
|
629
|
-
ExtendShared: "shared",
|
|
630
|
-
ExtendContext: "context"
|
|
631
|
-
};
|
|
632
607
|
for (const [extensionName, category] of Object.entries(interfaceExportCategories)) {
|
|
633
608
|
const matchingExports = exportedEntities.filter(
|
|
634
609
|
(entity) => entity.declaration === "interface" && entity.extends?.includes(extensionName)
|
|
@@ -725,10 +700,69 @@ async function verifyDirectoryCaseSensitivity(directoryPath, rootDirectory) {
|
|
|
725
700
|
} catch {
|
|
726
701
|
}
|
|
727
702
|
}
|
|
728
|
-
async function
|
|
703
|
+
async function extractExportEntitiesFromFile(absoluteFilePath, functionExportNames = ["createSchema", "createService", "createRoute"], interfaceExtendsNames = ["ExtendShared", "ExtendContext"]) {
|
|
704
|
+
const exportEntities = [];
|
|
705
|
+
const fileContent = await readFile(absoluteFilePath, "utf-8");
|
|
706
|
+
const parsed = await parseAsync(absoluteFilePath, fileContent);
|
|
707
|
+
for (const node of parsed.program.body) {
|
|
708
|
+
if (node.type === "ExportNamedDeclaration" && node.declaration && node.declaration.type === "TSInterfaceDeclaration") {
|
|
709
|
+
const decl = node.declaration;
|
|
710
|
+
if (Array.isArray(decl.extends) && decl.extends.some(
|
|
711
|
+
(dec) => dec.type === "TSInterfaceHeritage" && dec.expression.type === "Identifier" && interfaceExtendsNames.includes(dec.expression.name)
|
|
712
|
+
)) {
|
|
713
|
+
exportEntities.push({
|
|
714
|
+
name: decl.id?.name,
|
|
715
|
+
type: "interface",
|
|
716
|
+
declaration: "interface",
|
|
717
|
+
extends: decl.extends.filter((e) => e.type === "TSInterfaceHeritage" && e.expression.type === "Identifier").map((e) => e.expression.type === "Identifier" ? e.expression.name : false).filter((name) => Boolean(name))
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
for (const node of parsed.program.body) {
|
|
723
|
+
if (node.type === "ExportNamedDeclaration" && node.declaration && node.declaration.type === "VariableDeclaration") {
|
|
724
|
+
const decls = node.declaration.declarations;
|
|
725
|
+
if (Array.isArray(decls)) {
|
|
726
|
+
for (const decl of decls) {
|
|
727
|
+
if (decl.type === "VariableDeclarator" && decl.id.type === "Identifier" && decl.init && decl.init.type === "CallExpression" && decl.init.callee.type === "Identifier" && functionExportNames.includes(decl.init.callee.name)) {
|
|
728
|
+
exportEntities.push({
|
|
729
|
+
name: decl.id.name,
|
|
730
|
+
type: "function",
|
|
731
|
+
funcName: decl.init.callee.name
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
return exportEntities;
|
|
739
|
+
}
|
|
740
|
+
async function scanSilgiExports(path, packageName, silgiInstance = useSilgiCLI(), scanOptions = {}) {
|
|
729
741
|
const processedFilePaths = /* @__PURE__ */ new Set();
|
|
730
742
|
const alreadyScannedPaths = [];
|
|
731
743
|
const serverDirectory = path || silgiInstance.options.serverDir;
|
|
744
|
+
const functionExportNames = scanOptions.functionExportNames ?? ["createSchema", "createService", "createRoute"];
|
|
745
|
+
const interfaceExtendsNames = scanOptions.interfaceExtendsNames ?? ["ExtendShared", "ExtendContext"];
|
|
746
|
+
const functionExportCategories = {};
|
|
747
|
+
functionExportNames.forEach((name) => {
|
|
748
|
+
if (name === "createService")
|
|
749
|
+
functionExportCategories[name] = "service";
|
|
750
|
+
else if (name === "createSchema")
|
|
751
|
+
functionExportCategories[name] = "schema";
|
|
752
|
+
else if (name === "createShared")
|
|
753
|
+
functionExportCategories[name] = "shared";
|
|
754
|
+
else if (name === "createRoute")
|
|
755
|
+
functionExportCategories[name] = "route";
|
|
756
|
+
else functionExportCategories[name] = name;
|
|
757
|
+
});
|
|
758
|
+
const interfaceExportCategories = {};
|
|
759
|
+
interfaceExtendsNames.forEach((name) => {
|
|
760
|
+
if (name === "ExtendShared")
|
|
761
|
+
interfaceExportCategories[name] = "shared";
|
|
762
|
+
else if (name === "ExtendContext")
|
|
763
|
+
interfaceExportCategories[name] = "context";
|
|
764
|
+
else interfaceExportCategories[name] = name;
|
|
765
|
+
});
|
|
732
766
|
if (!serverDirectory) {
|
|
733
767
|
consola.warn("No server directory specified for scanning");
|
|
734
768
|
return;
|
|
@@ -755,21 +789,17 @@ async function scanSilgiExports(path, packageName, silgiInstance = useSilgiCLI()
|
|
|
755
789
|
continue;
|
|
756
790
|
}
|
|
757
791
|
try {
|
|
758
|
-
const
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
{ type: "declaration" }
|
|
763
|
-
);
|
|
764
|
-
const functionVariableExports = extractExportMatches(
|
|
765
|
-
FUNCTION_VARIABLE_EXPORT_REGEX,
|
|
766
|
-
fileContent,
|
|
767
|
-
{ type: "variable" }
|
|
792
|
+
const exportEntities = await extractExportEntitiesFromFile(
|
|
793
|
+
absoluteFilePath,
|
|
794
|
+
functionExportNames,
|
|
795
|
+
interfaceExtendsNames
|
|
768
796
|
);
|
|
769
|
-
const allExportedEntities =
|
|
797
|
+
const allExportedEntities = exportEntities;
|
|
770
798
|
const { runtimeExports, typeExports } = categorizeExports(
|
|
771
799
|
allExportedEntities,
|
|
772
|
-
absoluteFilePath
|
|
800
|
+
absoluteFilePath,
|
|
801
|
+
functionExportCategories,
|
|
802
|
+
interfaceExportCategories
|
|
773
803
|
);
|
|
774
804
|
registerExportsWithHooks(silgiInstance, runtimeExports, typeExports, packageName);
|
|
775
805
|
} catch (error) {
|
package/dist/cli/index.mjs
CHANGED
package/dist/cli/init.mjs
CHANGED
package/dist/cli/install.mjs
CHANGED
package/dist/cli/watch.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silgi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.37.0",
|
|
5
5
|
"private": false,
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"exports": {
|
|
@@ -117,6 +117,7 @@
|
|
|
117
117
|
"mlly": "^1.7.4",
|
|
118
118
|
"ofetch": "^1.4.1",
|
|
119
119
|
"ohash": "^2.0.11",
|
|
120
|
+
"oxc-parser": "^0.68.1",
|
|
120
121
|
"pathe": "^2.0.3",
|
|
121
122
|
"perfect-debounce": "^1.0.0",
|
|
122
123
|
"picocolors": "^1.1.1",
|