@unieojs/unio-evjs-adapter 0.1.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/README.md +151 -0
- package/dist/build.d.ts +2 -0
- package/dist/build.js +5 -0
- package/dist/build.js.map +1 -0
- package/dist/detect.d.ts +4 -0
- package/dist/detect.js +56 -0
- package/dist/detect.js.map +1 -0
- package/dist/emit.d.ts +2 -0
- package/dist/emit.js +262 -0
- package/dist/emit.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.js +80 -0
- package/dist/manifest.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.js +28 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +52 -0
- package/dist/utils.js.map +1 -0
- package/dist/validate.d.ts +5 -0
- package/dist/validate.js +152 -0
- package/dist/validate.js.map +1 -0
- package/package.json +46 -0
- package/src/build.ts +6 -0
- package/src/detect.ts +74 -0
- package/src/emit.ts +384 -0
- package/src/index.ts +45 -0
- package/src/manifest.ts +108 -0
- package/src/plugin.ts +39 -0
- package/src/types.ts +208 -0
- package/src/utils.ts +61 -0
- package/src/validate.ts +250 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D,MAAM,UAAU,gBAAgB,CAC9B,UAAkC,EAAE,EACpC,QAA+C;IAE/C,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,GAAG;YACP,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;YACnC,MAAM,iBAAiB,GAAG,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;YAEpD,OAAO;gBACL,KAAK,CAAC,QAAQ,CAAC,MAAM;oBACnB,IAAI,CAAC,iBAAiB;wBAAE,OAAO;oBAE/B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC;wBACnC,GAAG,OAAO;wBACV,GAAG;wBACH,cAAc,EAAE,MAAM,CAAC,cAAc;wBACrC,cAAc,EAAE,MAAM,CAAC,cAAc;qBACtC,CAAC,CAAC;oBACH,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,UAAkC,EAAE;IACvD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { EvBuildResult, EvPlugin, EvPluginContext, EvPluginHooks } from "@evjs/ev";
|
|
2
|
+
export type ClientManifest = EvBuildResult["clientManifest"];
|
|
3
|
+
export type ServerManifest = NonNullable<EvBuildResult["serverManifest"]>;
|
|
4
|
+
export type PageManifestEntry = NonNullable<ClientManifest["pages"]>[string];
|
|
5
|
+
export type RouteEntry = NonNullable<ClientManifest["routes"]>[number];
|
|
6
|
+
export type ServerFnEntry = ServerManifest["fns"][string];
|
|
7
|
+
export type { EvBuildResult, EvPlugin, EvPluginContext, EvPluginHooks, };
|
|
8
|
+
export type CapabilityStatus = "supported" | "partial" | "degraded" | "unsupported";
|
|
9
|
+
export interface UboaCapabilities {
|
|
10
|
+
static: CapabilityStatus;
|
|
11
|
+
routes: CapabilityStatus;
|
|
12
|
+
serverlessFunction: CapabilityStatus;
|
|
13
|
+
serverFunctionIntrospection: CapabilityStatus;
|
|
14
|
+
restRouteIntrospection: CapabilityStatus;
|
|
15
|
+
edgeMiddleware: CapabilityStatus;
|
|
16
|
+
rsc: CapabilityStatus;
|
|
17
|
+
imageOptimization: CapabilityStatus;
|
|
18
|
+
}
|
|
19
|
+
export interface UboaServerFunctionDescriptor {
|
|
20
|
+
name: string;
|
|
21
|
+
runtime: string;
|
|
22
|
+
entry: string;
|
|
23
|
+
handler: string;
|
|
24
|
+
handlerProtocol: string;
|
|
25
|
+
memory: number;
|
|
26
|
+
maxDuration: number;
|
|
27
|
+
environment: Record<string, unknown>;
|
|
28
|
+
bindings: Record<string, unknown>;
|
|
29
|
+
framework: Record<string, unknown>;
|
|
30
|
+
source: Record<string, unknown>;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
export interface ExtendServerFunctionDescriptorContext {
|
|
34
|
+
descriptor: UboaServerFunctionDescriptor;
|
|
35
|
+
serverFunctionName: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ExtendArtifactsContext {
|
|
38
|
+
artifacts: UboaArtifact[];
|
|
39
|
+
serverFunctionName: string;
|
|
40
|
+
}
|
|
41
|
+
export interface AfterEmitContext {
|
|
42
|
+
outputDir: string;
|
|
43
|
+
serverFunctionName: string;
|
|
44
|
+
}
|
|
45
|
+
export interface UnioEvjsAdapterOptions {
|
|
46
|
+
cwd?: string;
|
|
47
|
+
outputDir?: string;
|
|
48
|
+
serverFunctionName?: string;
|
|
49
|
+
serverFunctionEndpoint?: string;
|
|
50
|
+
extendServerFunctionDescriptor?: (context: ExtendServerFunctionDescriptorContext) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
51
|
+
extendArtifacts?: (context: ExtendArtifactsContext) => UboaArtifact[] | Promise<UboaArtifact[]>;
|
|
52
|
+
afterEmit?: (context: AfterEmitContext) => void | Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export interface DetectResult {
|
|
55
|
+
detected: boolean;
|
|
56
|
+
signals: string[];
|
|
57
|
+
configFiles: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface ValidationResult {
|
|
60
|
+
valid: boolean;
|
|
61
|
+
errors: string[];
|
|
62
|
+
warnings: string[];
|
|
63
|
+
}
|
|
64
|
+
interface UboaRouteBase {
|
|
65
|
+
id: string;
|
|
66
|
+
match: string;
|
|
67
|
+
}
|
|
68
|
+
export interface UboaStaticRoute extends UboaRouteBase {
|
|
69
|
+
type: "static";
|
|
70
|
+
entry: string;
|
|
71
|
+
serverFunction?: never;
|
|
72
|
+
edgeFunction?: never;
|
|
73
|
+
methods?: never;
|
|
74
|
+
}
|
|
75
|
+
export interface UboaServerFunctionRoute extends UboaRouteBase {
|
|
76
|
+
type: "serverFunction";
|
|
77
|
+
serverFunction: string;
|
|
78
|
+
methods?: string[];
|
|
79
|
+
entry?: never;
|
|
80
|
+
edgeFunction?: never;
|
|
81
|
+
}
|
|
82
|
+
export interface UboaEdgeFunctionRoute extends UboaRouteBase {
|
|
83
|
+
type: "edgeFunction";
|
|
84
|
+
edgeFunction: string;
|
|
85
|
+
entry?: never;
|
|
86
|
+
serverFunction?: never;
|
|
87
|
+
methods?: never;
|
|
88
|
+
}
|
|
89
|
+
export type UboaRoute = UboaStaticRoute | UboaServerFunctionRoute | UboaEdgeFunctionRoute;
|
|
90
|
+
interface UboaMiddlewareBase {
|
|
91
|
+
name: string;
|
|
92
|
+
match: string[];
|
|
93
|
+
}
|
|
94
|
+
export interface UboaEdgeMiddleware extends UboaMiddlewareBase {
|
|
95
|
+
runtime: "edge";
|
|
96
|
+
entry: string;
|
|
97
|
+
serverFunction?: never;
|
|
98
|
+
}
|
|
99
|
+
export interface UboaServerlessMiddleware extends UboaMiddlewareBase {
|
|
100
|
+
runtime: "serverless";
|
|
101
|
+
serverFunction: string;
|
|
102
|
+
entry?: never;
|
|
103
|
+
}
|
|
104
|
+
export type UboaMiddleware = UboaEdgeMiddleware | UboaServerlessMiddleware;
|
|
105
|
+
export type UboaArtifactResourceKind = "assets" | "serverFunction" | "edgeBundle" | "apiSchema";
|
|
106
|
+
export interface UboaAssetsArtifact {
|
|
107
|
+
id: string;
|
|
108
|
+
resourceKind: "assets";
|
|
109
|
+
path: string;
|
|
110
|
+
}
|
|
111
|
+
export interface UboaServerFunctionArtifact {
|
|
112
|
+
id: string;
|
|
113
|
+
resourceKind: "serverFunction";
|
|
114
|
+
path: string;
|
|
115
|
+
}
|
|
116
|
+
export interface UboaEdgeBundleArtifact {
|
|
117
|
+
id: string;
|
|
118
|
+
resourceKind: "edgeBundle";
|
|
119
|
+
path: string;
|
|
120
|
+
}
|
|
121
|
+
export interface UboaArtifactReference {
|
|
122
|
+
id: string;
|
|
123
|
+
resourceKind: UboaArtifactResourceKind;
|
|
124
|
+
}
|
|
125
|
+
export type UboaApiSchemaFormat = "oneapi";
|
|
126
|
+
export interface UboaApiSchemaArtifact {
|
|
127
|
+
id: string;
|
|
128
|
+
resourceKind: "apiSchema";
|
|
129
|
+
path: string;
|
|
130
|
+
schemaFormat: UboaApiSchemaFormat;
|
|
131
|
+
describes?: UboaArtifactReference;
|
|
132
|
+
}
|
|
133
|
+
export type UboaArtifact = UboaAssetsArtifact | UboaServerFunctionArtifact | UboaEdgeBundleArtifact | UboaApiSchemaArtifact;
|
|
134
|
+
export interface AdapterBuildResult {
|
|
135
|
+
outputDir: string;
|
|
136
|
+
routes: UboaRoute[];
|
|
137
|
+
middleware: UboaMiddleware[];
|
|
138
|
+
artifacts: UboaArtifact[];
|
|
139
|
+
capabilities: UboaCapabilities;
|
|
140
|
+
warnings: string[];
|
|
141
|
+
}
|
|
142
|
+
export interface EmitUboaOptions extends UnioEvjsAdapterOptions {
|
|
143
|
+
clientManifest: ClientManifest;
|
|
144
|
+
serverManifest?: ServerManifest;
|
|
145
|
+
}
|
|
146
|
+
export type BuildOptions = EmitUboaOptions;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function pathExists(filePath: string): Promise<boolean>;
|
|
2
|
+
export declare function readJson(filePath: string): Promise<unknown>;
|
|
3
|
+
export declare function writeJson(filePath: string, value: unknown): Promise<void>;
|
|
4
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
5
|
+
export declare function isStringArray(value: unknown): value is string[];
|
|
6
|
+
export declare function toPosix(filePath: string): string;
|
|
7
|
+
export declare function normalizeRoutePath(routePath: string): string;
|
|
8
|
+
export declare function routeId(prefix: string, routePath: string): string;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function pathExists(filePath) {
|
|
4
|
+
return fs.access(filePath).then(() => true, () => false);
|
|
5
|
+
}
|
|
6
|
+
export async function readJson(filePath) {
|
|
7
|
+
return JSON.parse(await fs.readFile(filePath, "utf8"));
|
|
8
|
+
}
|
|
9
|
+
export async function writeJson(filePath, value) {
|
|
10
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
11
|
+
await fs.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
12
|
+
}
|
|
13
|
+
export function isRecord(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
export function isStringArray(value) {
|
|
17
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
18
|
+
}
|
|
19
|
+
export function toPosix(filePath) {
|
|
20
|
+
return filePath.split(path.sep).join("/");
|
|
21
|
+
}
|
|
22
|
+
export function normalizeRoutePath(routePath) {
|
|
23
|
+
if (!routePath || routePath === "/")
|
|
24
|
+
return "/";
|
|
25
|
+
if (routePath === "*")
|
|
26
|
+
return "/:path*";
|
|
27
|
+
const withLeadingSlash = routePath.startsWith("/")
|
|
28
|
+
? routePath
|
|
29
|
+
: `/${routePath}`;
|
|
30
|
+
return withLeadingSlash
|
|
31
|
+
.split("/")
|
|
32
|
+
.map((segment) => {
|
|
33
|
+
if (segment === "*")
|
|
34
|
+
return ":path*";
|
|
35
|
+
if (segment.startsWith("$") && segment.length > 1) {
|
|
36
|
+
return `:${segment.slice(1)}`;
|
|
37
|
+
}
|
|
38
|
+
return segment;
|
|
39
|
+
})
|
|
40
|
+
.join("/")
|
|
41
|
+
.replace(/\/+/g, "/");
|
|
42
|
+
}
|
|
43
|
+
export function routeId(prefix, routePath) {
|
|
44
|
+
const slug = routePath
|
|
45
|
+
.replace(/^\/+/, "")
|
|
46
|
+
.replace(/[:*$]+/g, "")
|
|
47
|
+
.replace(/[^A-Za-z0-9]+/g, "-")
|
|
48
|
+
.replace(/^-+|-+$/g, "")
|
|
49
|
+
.toLowerCase();
|
|
50
|
+
return slug ? `${prefix}-${slug}` : `${prefix}-index`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC7B,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAc;IAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAChD,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAChD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAEpB,OAAO,gBAAgB;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,QAAQ,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,SAAiB;IACvD,MAAM,IAAI,GAAG,SAAS;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,WAAW,EAAE,CAAC;IACjB,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,CAAC;AACxD,CAAC"}
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { isRecord, pathExists, readJson } from "./utils.js";
|
|
3
|
+
const ARTIFACT_RESOURCE_KINDS = [
|
|
4
|
+
"assets",
|
|
5
|
+
"serverFunction",
|
|
6
|
+
"edgeBundle",
|
|
7
|
+
"apiSchema",
|
|
8
|
+
];
|
|
9
|
+
function artifactKey(resourceKind, id) {
|
|
10
|
+
return `${resourceKind}:${id}`;
|
|
11
|
+
}
|
|
12
|
+
function isArtifactResourceKind(value) {
|
|
13
|
+
return (typeof value === "string" &&
|
|
14
|
+
ARTIFACT_RESOURCE_KINDS.includes(value));
|
|
15
|
+
}
|
|
16
|
+
function isSafeRelativePath(value) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return false;
|
|
19
|
+
if (path.isAbsolute(value) || path.win32.isAbsolute(value))
|
|
20
|
+
return false;
|
|
21
|
+
return !value.split(/[\\/]+/).includes("..");
|
|
22
|
+
}
|
|
23
|
+
function resolveArtifactPath(root, artifactPath, artifactId, errors) {
|
|
24
|
+
if (!isSafeRelativePath(artifactPath)) {
|
|
25
|
+
errors.push(`Artifact ${artifactId} path must stay within .unio/output: ${artifactPath}`);
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return path.resolve(root, artifactPath);
|
|
29
|
+
}
|
|
30
|
+
function validateArtifactReference(value, label, errors) {
|
|
31
|
+
if (!isRecord(value)) {
|
|
32
|
+
errors.push(`${label} must be an object`);
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const { id, resourceKind } = value;
|
|
36
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
37
|
+
errors.push(`${label}.id must be a non-empty string`);
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (!isArtifactResourceKind(resourceKind)) {
|
|
41
|
+
errors.push(`${label}.resourceKind must be one of ${ARTIFACT_RESOURCE_KINDS.join(", ")}`);
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return { id, resourceKind };
|
|
45
|
+
}
|
|
46
|
+
function validateArtifactBase(root, value, index, errors) {
|
|
47
|
+
const label = `artifacts[${index}]`;
|
|
48
|
+
if (!isRecord(value)) {
|
|
49
|
+
errors.push(`${label} must be an object`);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const { id, resourceKind, path: artifactPath } = value;
|
|
53
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
54
|
+
errors.push(`${label}.id must be a non-empty string`);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
if (!isArtifactResourceKind(resourceKind)) {
|
|
58
|
+
errors.push(`${label}.resourceKind must be one of ${ARTIFACT_RESOURCE_KINDS.join(", ")}`);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
if (typeof artifactPath !== "string" || artifactPath.length === 0) {
|
|
62
|
+
errors.push(`${label}.path must be a non-empty string`);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const absolutePath = resolveArtifactPath(root, artifactPath, id, errors);
|
|
66
|
+
if (!absolutePath)
|
|
67
|
+
return undefined;
|
|
68
|
+
return {
|
|
69
|
+
id,
|
|
70
|
+
resourceKind,
|
|
71
|
+
path: artifactPath,
|
|
72
|
+
absolutePath,
|
|
73
|
+
value,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function readRequiredJson(root, file, errors) {
|
|
77
|
+
const filePath = path.join(root, file);
|
|
78
|
+
if (!(await pathExists(filePath))) {
|
|
79
|
+
errors.push(`Missing ${file}`);
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return await readJson(filePath);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
errors.push(`Invalid JSON in ${file}: ${error.message}`);
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export async function validate(options) {
|
|
91
|
+
const root = path.resolve(options.cwd, options.outputDir ?? ".unio/output");
|
|
92
|
+
const errors = [];
|
|
93
|
+
const warnings = [];
|
|
94
|
+
if (!(await pathExists(root))) {
|
|
95
|
+
return {
|
|
96
|
+
valid: false,
|
|
97
|
+
errors: [`Missing output directory: ${root}`],
|
|
98
|
+
warnings,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
await readRequiredJson(root, "unio.json", errors);
|
|
102
|
+
const routes = await readRequiredJson(root, "routes.json", errors);
|
|
103
|
+
await readRequiredJson(root, "middleware.json", errors);
|
|
104
|
+
const artifactsManifest = await readRequiredJson(root, "artifacts.json", errors);
|
|
105
|
+
if (routes && !Array.isArray(routes)) {
|
|
106
|
+
errors.push("routes.json must be an array");
|
|
107
|
+
}
|
|
108
|
+
const artifacts = artifactsManifest?.artifacts;
|
|
109
|
+
if (artifactsManifest && !Array.isArray(artifacts)) {
|
|
110
|
+
errors.push("artifacts.json artifacts must be an array");
|
|
111
|
+
}
|
|
112
|
+
const validArtifacts = Array.isArray(artifacts)
|
|
113
|
+
? artifacts
|
|
114
|
+
.map((artifact, index) => validateArtifactBase(root, artifact, index, errors))
|
|
115
|
+
.filter((artifact) => Boolean(artifact))
|
|
116
|
+
: [];
|
|
117
|
+
const artifactKeys = new Set(validArtifacts.map((artifact) => artifactKey(artifact.resourceKind, artifact.id)));
|
|
118
|
+
for (const artifact of validArtifacts) {
|
|
119
|
+
if (!(await pathExists(artifact.absolutePath))) {
|
|
120
|
+
errors.push(`Artifact path does not exist: ${artifact.path}`);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (artifact.resourceKind === "serverFunction") {
|
|
124
|
+
const serverFunctionJson = await readRequiredJson(artifact.absolutePath, "serverFunction.json", errors);
|
|
125
|
+
if (serverFunctionJson?.entry) {
|
|
126
|
+
const entryPath = path.join(artifact.absolutePath, serverFunctionJson.entry);
|
|
127
|
+
if (!(await pathExists(entryPath))) {
|
|
128
|
+
errors.push(`serverFunction ${artifact.id} entry does not exist: ${serverFunctionJson.entry}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (artifact.resourceKind === "apiSchema") {
|
|
133
|
+
if (artifact.value.schemaFormat !== "oneapi") {
|
|
134
|
+
errors.push(`apiSchema ${artifact.id} schemaFormat must be "oneapi"`);
|
|
135
|
+
}
|
|
136
|
+
if (artifact.value.describes !== undefined) {
|
|
137
|
+
const reference = validateArtifactReference(artifact.value.describes, `apiSchema ${artifact.id} describes`, errors);
|
|
138
|
+
if (reference &&
|
|
139
|
+
!artifactKeys.has(artifactKey(reference.resourceKind, reference.id))) {
|
|
140
|
+
const missingArtifact = artifactKey(reference.resourceKind, reference.id);
|
|
141
|
+
errors.push(`apiSchema ${artifact.id} describes missing artifact: ${missingArtifact}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
valid: errors.length === 0,
|
|
148
|
+
errors,
|
|
149
|
+
warnings,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@unieojs/unio-evjs-adapter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "EVJS adapter that emits Unio Build Output API manifests.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/unieojs/unio-adapters.git",
|
|
18
|
+
"directory": "packages/evjs"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public",
|
|
22
|
+
"registry": "https://registry.npmjs.org"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"src"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json",
|
|
30
|
+
"test": "node --import tsx --test \"test/**/*.test.ts\"",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@evjs/ev": "^0.1.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@evjs/ev": "^0.1.0",
|
|
38
|
+
"@types/node": "^22.15.0",
|
|
39
|
+
"tsx": "^4.20.0",
|
|
40
|
+
"typescript": "^5.8.0"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18.19.0"
|
|
44
|
+
},
|
|
45
|
+
"license": "MIT"
|
|
46
|
+
}
|
package/src/build.ts
ADDED
package/src/detect.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { DetectResult } from "./types.js";
|
|
5
|
+
import { isRecord, pathExists, readJson } from "./utils.js";
|
|
6
|
+
|
|
7
|
+
const CONFIG_FILES = ["ev.config.ts", "ev.config.js", "ev.config.mjs"];
|
|
8
|
+
|
|
9
|
+
interface PackageJson {
|
|
10
|
+
scripts?: Record<string, string>;
|
|
11
|
+
dependencies?: Record<string, string>;
|
|
12
|
+
devDependencies?: Record<string, string>;
|
|
13
|
+
peerDependencies?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function hasDependency(pkg: PackageJson, name: string): boolean {
|
|
17
|
+
return Boolean(
|
|
18
|
+
pkg.dependencies?.[name] ??
|
|
19
|
+
pkg.devDependencies?.[name] ??
|
|
20
|
+
pkg.peerDependencies?.[name],
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function asPackageField(value: unknown): Record<string, string> | undefined {
|
|
25
|
+
return isRecord(value) ? value as Record<string, string> : undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function toPackageJson(value: unknown): PackageJson {
|
|
29
|
+
if (!isRecord(value)) return {};
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
scripts: asPackageField(value.scripts),
|
|
33
|
+
dependencies: asPackageField(value.dependencies),
|
|
34
|
+
devDependencies: asPackageField(value.devDependencies),
|
|
35
|
+
peerDependencies: asPackageField(value.peerDependencies),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function detect(options: { cwd: string }): Promise<DetectResult> {
|
|
40
|
+
const cwd = path.resolve(options.cwd);
|
|
41
|
+
const signals: string[] = [];
|
|
42
|
+
const configFiles: string[] = [];
|
|
43
|
+
|
|
44
|
+
for (const file of CONFIG_FILES) {
|
|
45
|
+
if (await pathExists(path.join(cwd, file))) {
|
|
46
|
+
configFiles.push(file);
|
|
47
|
+
signals.push(`config:${file}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
52
|
+
if (await pathExists(packageJsonPath)) {
|
|
53
|
+
const pkg = toPackageJson(await readJson(packageJsonPath));
|
|
54
|
+
for (const dep of ["@evjs/ev", "@evjs/cli"]) {
|
|
55
|
+
if (hasDependency(pkg, dep)) {
|
|
56
|
+
signals.push(`dependency:${dep}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for (const [name, script] of Object.entries(pkg.scripts ?? {})) {
|
|
61
|
+
if (/\bev\s+build\b/.test(script) || /\bevjs\s+build\b/.test(script)) {
|
|
62
|
+
signals.push(`script:${name}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
await fs.stat(cwd);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
detected: signals.length > 0,
|
|
71
|
+
signals,
|
|
72
|
+
configFiles,
|
|
73
|
+
};
|
|
74
|
+
}
|