@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
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# @unieojs/unio-evjs-adapter
|
|
2
|
+
|
|
3
|
+
EVJS adapter for emitting Unio Build Output API (`uboa`) manifests.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Preferred integration is the EVJS plugin hook:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { defineConfig } from "@evjs/ev";
|
|
11
|
+
import { unio } from "@unieojs/unio-evjs-adapter";
|
|
12
|
+
|
|
13
|
+
export default defineConfig({
|
|
14
|
+
plugins: [unio()],
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
After a production `ev build`, the plugin writes `.unio/output` with `unio.json`,
|
|
19
|
+
`routes.json`, `middleware.json`, `artifacts.json`, static assets, and an
|
|
20
|
+
`evjs` serverFunction when the EVJS `buildEnd` server manifest has an entry.
|
|
21
|
+
|
|
22
|
+
`build()` and `emitUboa()` are lower-level APIs used by the plugin and expect
|
|
23
|
+
manifest objects supplied by `@evjs/ev` build hooks. They do not invoke `ev build`,
|
|
24
|
+
modify user config, or parse EVJS manifest files from `dist`.
|
|
25
|
+
|
|
26
|
+
## Extension Hooks
|
|
27
|
+
|
|
28
|
+
The emitter stays platform-neutral. Deployment integrations that need
|
|
29
|
+
platform-specific metadata or sidecar files can extend the generic uboa output
|
|
30
|
+
through `unio()` or `emitUboa()` options instead of forking the EVJS adapter.
|
|
31
|
+
|
|
32
|
+
The available hooks are:
|
|
33
|
+
|
|
34
|
+
- `extendServerFunctionDescriptor`: called when a server function is emitted.
|
|
35
|
+
It receives the generated `serverFunction.json` descriptor and must return an
|
|
36
|
+
object. Use this to add generic deployment metadata, `x-*` extension records,
|
|
37
|
+
environment variables, or runtime bindings.
|
|
38
|
+
- `extendArtifacts`: called after built-in artifacts are collected and before
|
|
39
|
+
`artifacts.json` is written. It receives the current artifact list and must
|
|
40
|
+
return the final artifact list. Use this to register sidecars such as
|
|
41
|
+
`apiSchema` artifacts.
|
|
42
|
+
- `afterEmit`: called after the adapter writes the uboa manifests. Use this to
|
|
43
|
+
write files referenced by extra artifacts or descriptor metadata.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import fs from "node:fs/promises";
|
|
49
|
+
import path from "node:path";
|
|
50
|
+
import { defineConfig } from "@evjs/ev";
|
|
51
|
+
import { unio } from "@unieojs/unio-evjs-adapter";
|
|
52
|
+
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
plugins: [
|
|
55
|
+
unio({
|
|
56
|
+
extendServerFunctionDescriptor({ descriptor, serverFunctionName }) {
|
|
57
|
+
return {
|
|
58
|
+
...descriptor,
|
|
59
|
+
deployment: { mode: "dedicated" },
|
|
60
|
+
"x-example-platform": {
|
|
61
|
+
resourceName: serverFunctionName,
|
|
62
|
+
manifest: `api-schemas/${serverFunctionName}/metadata.json`,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
extendArtifacts({ artifacts, serverFunctionName }) {
|
|
67
|
+
return [
|
|
68
|
+
...artifacts,
|
|
69
|
+
{
|
|
70
|
+
id: `${serverFunctionName}-api-schema`,
|
|
71
|
+
resourceKind: "apiSchema",
|
|
72
|
+
schemaFormat: "oneapi",
|
|
73
|
+
path: `api-schemas/${serverFunctionName}/metadata.json`,
|
|
74
|
+
describes: {
|
|
75
|
+
resourceKind: "serverFunction",
|
|
76
|
+
id: serverFunctionName,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
},
|
|
81
|
+
async afterEmit({ outputDir, serverFunctionName }) {
|
|
82
|
+
await fs.mkdir(
|
|
83
|
+
path.join(outputDir, "api-schemas", serverFunctionName),
|
|
84
|
+
{ recursive: true },
|
|
85
|
+
);
|
|
86
|
+
await fs.writeFile(
|
|
87
|
+
path.join(outputDir, "api-schemas", serverFunctionName, "metadata.json"),
|
|
88
|
+
`${JSON.stringify({ oneapi: "1.0.0" }, null, 2)}\n`,
|
|
89
|
+
"utf8",
|
|
90
|
+
);
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Hooks should keep platform-specific fields namespaced, for example under an
|
|
98
|
+
`x-*` key, so the base adapter contract remains framework-neutral.
|
|
99
|
+
|
|
100
|
+
The generated output is:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
.unio/output/
|
|
104
|
+
unio.json
|
|
105
|
+
routes.json
|
|
106
|
+
middleware.json
|
|
107
|
+
artifacts.json
|
|
108
|
+
features.json
|
|
109
|
+
observability.json
|
|
110
|
+
static/
|
|
111
|
+
index.html
|
|
112
|
+
assets/
|
|
113
|
+
app.js
|
|
114
|
+
app.css
|
|
115
|
+
server-functions/
|
|
116
|
+
evjs/
|
|
117
|
+
serverFunction.json
|
|
118
|
+
main.js
|
|
119
|
+
chunks/
|
|
120
|
+
dep.js
|
|
121
|
+
api-schemas/
|
|
122
|
+
evjs/
|
|
123
|
+
metadata.json
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`apiSchema` entries in `artifacts.json` describe schema sidecars:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"id": "evjs-api-schema",
|
|
131
|
+
"resourceKind": "apiSchema",
|
|
132
|
+
"schemaFormat": "oneapi",
|
|
133
|
+
"path": "api-schemas/evjs/metadata.json",
|
|
134
|
+
"describes": {
|
|
135
|
+
"resourceKind": "serverFunction",
|
|
136
|
+
"id": "evjs"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`describes` is optional. When present, validation checks that the referenced
|
|
142
|
+
artifact exists in the same `artifacts.json`.
|
|
143
|
+
|
|
144
|
+
## P0 Behavior
|
|
145
|
+
|
|
146
|
+
- CSR-only EVJS builds emit static-only uboa output.
|
|
147
|
+
- Fullstack EVJS builds map the whole server bundle to one Fetch-style
|
|
148
|
+
`serverFunction` named `evjs`.
|
|
149
|
+
- `POST /api/fn` is the default EVJS server function route.
|
|
150
|
+
- REST route handlers are bound through `/api/:path*` and marked degraded until
|
|
151
|
+
EVJS exposes stable server route metadata.
|
package/dist/build.d.ts
ADDED
package/dist/build.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/detect.d.ts
ADDED
package/dist/detect.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isRecord, pathExists, readJson } from "./utils.js";
|
|
4
|
+
const CONFIG_FILES = ["ev.config.ts", "ev.config.js", "ev.config.mjs"];
|
|
5
|
+
function hasDependency(pkg, name) {
|
|
6
|
+
return Boolean(pkg.dependencies?.[name] ??
|
|
7
|
+
pkg.devDependencies?.[name] ??
|
|
8
|
+
pkg.peerDependencies?.[name]);
|
|
9
|
+
}
|
|
10
|
+
function asPackageField(value) {
|
|
11
|
+
return isRecord(value) ? value : undefined;
|
|
12
|
+
}
|
|
13
|
+
function toPackageJson(value) {
|
|
14
|
+
if (!isRecord(value))
|
|
15
|
+
return {};
|
|
16
|
+
return {
|
|
17
|
+
scripts: asPackageField(value.scripts),
|
|
18
|
+
dependencies: asPackageField(value.dependencies),
|
|
19
|
+
devDependencies: asPackageField(value.devDependencies),
|
|
20
|
+
peerDependencies: asPackageField(value.peerDependencies),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export async function detect(options) {
|
|
24
|
+
const cwd = path.resolve(options.cwd);
|
|
25
|
+
const signals = [];
|
|
26
|
+
const configFiles = [];
|
|
27
|
+
for (const file of CONFIG_FILES) {
|
|
28
|
+
if (await pathExists(path.join(cwd, file))) {
|
|
29
|
+
configFiles.push(file);
|
|
30
|
+
signals.push(`config:${file}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
34
|
+
if (await pathExists(packageJsonPath)) {
|
|
35
|
+
const pkg = toPackageJson(await readJson(packageJsonPath));
|
|
36
|
+
for (const dep of ["@evjs/ev", "@evjs/cli"]) {
|
|
37
|
+
if (hasDependency(pkg, dep)) {
|
|
38
|
+
signals.push(`dependency:${dep}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const [name, script] of Object.entries(pkg.scripts ?? {})) {
|
|
42
|
+
if (/\bev\s+build\b/.test(script) || /\bevjs\s+build\b/.test(script)) {
|
|
43
|
+
signals.push(`script:${name}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await fs.stat(cwd);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
detected: signals.length > 0,
|
|
52
|
+
signals,
|
|
53
|
+
configFiles,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
|
package/dist/emit.d.ts
ADDED
package/dist/emit.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { assertClientManifest, assertServerManifest, } from "./manifest.js";
|
|
4
|
+
import { isRecord, normalizeRoutePath, pathExists, routeId, toPosix, writeJson, } from "./utils.js";
|
|
5
|
+
const ADAPTER_PACKAGE = "@unieojs/unio-evjs-adapter";
|
|
6
|
+
const UBOA_VERSION = "1.0.0";
|
|
7
|
+
const DEFAULT_SERVER_FUNCTION = "evjs";
|
|
8
|
+
const DEFAULT_SERVER_ENDPOINT = "/api/fn";
|
|
9
|
+
function outputRoot(cwd, outputDir) {
|
|
10
|
+
return path.resolve(cwd, outputDir ?? ".unio/output");
|
|
11
|
+
}
|
|
12
|
+
async function resolveBuildInputs(options) {
|
|
13
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
14
|
+
const clientManifest = options.clientManifest;
|
|
15
|
+
const serverManifest = options.serverManifest;
|
|
16
|
+
if (!clientManifest) {
|
|
17
|
+
throw new Error("EVJS client manifest must be provided from @evjs/ev buildEnd metadata.");
|
|
18
|
+
}
|
|
19
|
+
assertClientManifest(clientManifest);
|
|
20
|
+
if (serverManifest) {
|
|
21
|
+
assertServerManifest(serverManifest);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
clientManifest,
|
|
25
|
+
serverManifest,
|
|
26
|
+
clientRoot: await resolveClientRoot(cwd, clientManifest, serverManifest),
|
|
27
|
+
serverRoot: path.join(cwd, "dist/server"),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function resolveClientRoot(cwd, clientManifest, serverManifest) {
|
|
31
|
+
const fullstackClientRoot = path.join(cwd, "dist/client");
|
|
32
|
+
const flatClientRoot = path.join(cwd, "dist");
|
|
33
|
+
if (serverManifest ||
|
|
34
|
+
(clientManifest.pages &&
|
|
35
|
+
Object.keys(clientManifest.pages).length > 0)) {
|
|
36
|
+
return fullstackClientRoot;
|
|
37
|
+
}
|
|
38
|
+
if (await pathExists(path.join(flatClientRoot, "index.html"))) {
|
|
39
|
+
return flatClientRoot;
|
|
40
|
+
}
|
|
41
|
+
return await pathExists(fullstackClientRoot)
|
|
42
|
+
? fullstackClientRoot
|
|
43
|
+
: flatClientRoot;
|
|
44
|
+
}
|
|
45
|
+
async function copyIfExists(source, dest) {
|
|
46
|
+
if (!(await pathExists(source)))
|
|
47
|
+
return false;
|
|
48
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
49
|
+
await fs.cp(source, dest, { recursive: true });
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
function buildContentVersion() {
|
|
53
|
+
const parts = [
|
|
54
|
+
process.env.SPRINT_ID ? `SPRINT=${process.env.SPRINT_ID}` : undefined,
|
|
55
|
+
process.env.COMMIT_ID ? `COMMIT=${process.env.COMMIT_ID}` : undefined,
|
|
56
|
+
].filter(Boolean);
|
|
57
|
+
return parts.length > 0 ? parts.join(", ") : "local";
|
|
58
|
+
}
|
|
59
|
+
function hasServerEntry(manifest) {
|
|
60
|
+
return Boolean(manifest?.entry);
|
|
61
|
+
}
|
|
62
|
+
function hasRscMetadata(manifest) {
|
|
63
|
+
if (!isRecord(manifest) || !isRecord(manifest.rsc))
|
|
64
|
+
return false;
|
|
65
|
+
return Object.keys(manifest.rsc).length > 0;
|
|
66
|
+
}
|
|
67
|
+
function buildCapabilities(clientManifest, serverManifest) {
|
|
68
|
+
const serverEnabled = hasServerEntry(serverManifest);
|
|
69
|
+
const hasFns = serverEnabled && Object.keys(serverManifest.fns).length > 0;
|
|
70
|
+
let serverFunctionIntrospection = "unsupported";
|
|
71
|
+
if (serverEnabled) {
|
|
72
|
+
serverFunctionIntrospection = hasFns ? "supported" : "degraded";
|
|
73
|
+
}
|
|
74
|
+
const rsc = hasRscMetadata(serverManifest)
|
|
75
|
+
? "partial"
|
|
76
|
+
: "unsupported";
|
|
77
|
+
return {
|
|
78
|
+
static: clientManifest ? "supported" : "unsupported",
|
|
79
|
+
routes: "supported",
|
|
80
|
+
serverlessFunction: serverEnabled ? "supported" : "unsupported",
|
|
81
|
+
serverFunctionIntrospection,
|
|
82
|
+
restRouteIntrospection: serverEnabled ? "degraded" : "unsupported",
|
|
83
|
+
edgeMiddleware: "unsupported",
|
|
84
|
+
rsc,
|
|
85
|
+
imageOptimization: "unsupported",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function staticRoutesForRoutes(routes, entry) {
|
|
89
|
+
const sourceRoutes = routes && routes.length > 0 ? routes : [{ path: "/" }, { path: "*" }];
|
|
90
|
+
const seen = new Set();
|
|
91
|
+
const result = [];
|
|
92
|
+
for (const route of sourceRoutes) {
|
|
93
|
+
const match = normalizeRoutePath(route.path);
|
|
94
|
+
const key = `${match}:${entry}`;
|
|
95
|
+
if (seen.has(key))
|
|
96
|
+
continue;
|
|
97
|
+
seen.add(key);
|
|
98
|
+
result.push({
|
|
99
|
+
id: routeId("static", match),
|
|
100
|
+
match,
|
|
101
|
+
type: "static",
|
|
102
|
+
entry,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
function pageEntry(pageName) {
|
|
108
|
+
return `static/${pageName}.html`;
|
|
109
|
+
}
|
|
110
|
+
function pageRoutes(pages) {
|
|
111
|
+
const routes = [];
|
|
112
|
+
for (const pageName of Object.keys(pages)) {
|
|
113
|
+
const match = pageName === "index" ? "/" : normalizeRoutePath(pageName);
|
|
114
|
+
routes.push({
|
|
115
|
+
id: routeId("static", match),
|
|
116
|
+
match,
|
|
117
|
+
type: "static",
|
|
118
|
+
entry: pageEntry(pageName),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return routes;
|
|
122
|
+
}
|
|
123
|
+
function buildStaticRoutes(clientManifest) {
|
|
124
|
+
if (clientManifest.pages && Object.keys(clientManifest.pages).length > 0) {
|
|
125
|
+
return pageRoutes(clientManifest.pages);
|
|
126
|
+
}
|
|
127
|
+
return staticRoutesForRoutes(clientManifest.routes, "static/index.html");
|
|
128
|
+
}
|
|
129
|
+
function serverRoutes(serverFunctionName, endpoint) {
|
|
130
|
+
return [
|
|
131
|
+
{
|
|
132
|
+
id: "server-evjs-rpc",
|
|
133
|
+
match: endpoint,
|
|
134
|
+
type: "serverFunction",
|
|
135
|
+
serverFunction: serverFunctionName,
|
|
136
|
+
methods: ["POST"],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "server-evjs-api-fallback",
|
|
140
|
+
match: "/api/:path*",
|
|
141
|
+
type: "serverFunction",
|
|
142
|
+
serverFunction: serverFunctionName,
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
}
|
|
146
|
+
async function emitServerFunction(root, serverRoot, serverManifest, serverFunctionName, endpoint, extendDescriptor) {
|
|
147
|
+
const functionDir = path.join(root, "server-functions", serverFunctionName);
|
|
148
|
+
const sourceEntry = path.join(serverRoot, serverManifest.entry);
|
|
149
|
+
if (!(await pathExists(sourceEntry))) {
|
|
150
|
+
throw new Error(`EVJS server entry not found: ${toPosix(sourceEntry)}`);
|
|
151
|
+
}
|
|
152
|
+
await fs.mkdir(path.dirname(functionDir), { recursive: true });
|
|
153
|
+
await fs.cp(serverRoot, functionDir, { recursive: true });
|
|
154
|
+
const descriptor = {
|
|
155
|
+
name: serverFunctionName,
|
|
156
|
+
runtime: "nodejs22",
|
|
157
|
+
entry: toPosix(serverManifest.entry),
|
|
158
|
+
handler: "default",
|
|
159
|
+
handlerProtocol: "fetch",
|
|
160
|
+
memory: 512,
|
|
161
|
+
maxDuration: 10,
|
|
162
|
+
environment: {},
|
|
163
|
+
bindings: {},
|
|
164
|
+
framework: {
|
|
165
|
+
name: "evjs",
|
|
166
|
+
serverFunctionEndpoint: endpoint,
|
|
167
|
+
serverManifest: "dist/server/manifest.json",
|
|
168
|
+
serverFunctions: Object.keys(serverManifest.fns),
|
|
169
|
+
},
|
|
170
|
+
source: {
|
|
171
|
+
entry: `dist/server/${serverManifest.entry}`,
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
const extendedDescriptor = extendDescriptor
|
|
175
|
+
? await extendDescriptor({ descriptor, serverFunctionName })
|
|
176
|
+
: descriptor;
|
|
177
|
+
if (!isRecord(extendedDescriptor)) {
|
|
178
|
+
throw new Error("extendServerFunctionDescriptor must return an object.");
|
|
179
|
+
}
|
|
180
|
+
await writeJson(path.join(functionDir, "serverFunction.json"), extendedDescriptor);
|
|
181
|
+
}
|
|
182
|
+
export async function emitUboa(options) {
|
|
183
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
184
|
+
const root = outputRoot(cwd, options.outputDir);
|
|
185
|
+
const serverFunctionName = options.serverFunctionName ?? DEFAULT_SERVER_FUNCTION;
|
|
186
|
+
const serverEndpoint = options.serverFunctionEndpoint ?? DEFAULT_SERVER_ENDPOINT;
|
|
187
|
+
const { clientManifest, serverManifest, clientRoot, serverRoot } = await resolveBuildInputs({ ...options, cwd });
|
|
188
|
+
const warnings = [];
|
|
189
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
190
|
+
await fs.mkdir(root, { recursive: true });
|
|
191
|
+
await copyIfExists(clientRoot, path.join(root, "static"));
|
|
192
|
+
const routes = buildStaticRoutes(clientManifest);
|
|
193
|
+
const middleware = [];
|
|
194
|
+
let artifacts = [
|
|
195
|
+
{ id: "static", resourceKind: "assets", path: "static" },
|
|
196
|
+
];
|
|
197
|
+
if (hasServerEntry(serverManifest)) {
|
|
198
|
+
await emitServerFunction(root, serverRoot, serverManifest, serverFunctionName, serverEndpoint, options.extendServerFunctionDescriptor);
|
|
199
|
+
routes.push(...serverRoutes(serverFunctionName, serverEndpoint));
|
|
200
|
+
artifacts.push({
|
|
201
|
+
id: serverFunctionName,
|
|
202
|
+
resourceKind: "serverFunction",
|
|
203
|
+
path: `server-functions/${serverFunctionName}`,
|
|
204
|
+
});
|
|
205
|
+
if (Object.keys(serverManifest.fns).length === 0) {
|
|
206
|
+
warnings.push("EVJS serverManifest.fns is empty; server function introspection is degraded.");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (options.extendArtifacts) {
|
|
210
|
+
const extendedArtifacts = await options.extendArtifacts({
|
|
211
|
+
artifacts,
|
|
212
|
+
serverFunctionName,
|
|
213
|
+
});
|
|
214
|
+
if (!Array.isArray(extendedArtifacts)) {
|
|
215
|
+
throw new Error("extendArtifacts must return an array.");
|
|
216
|
+
}
|
|
217
|
+
artifacts = extendedArtifacts;
|
|
218
|
+
}
|
|
219
|
+
const capabilities = buildCapabilities(clientManifest, serverManifest);
|
|
220
|
+
await writeJson(path.join(root, "unio.json"), {
|
|
221
|
+
version: UBOA_VERSION,
|
|
222
|
+
framework: {
|
|
223
|
+
name: "evjs",
|
|
224
|
+
version: "unknown",
|
|
225
|
+
adapter: ADAPTER_PACKAGE,
|
|
226
|
+
},
|
|
227
|
+
build: {
|
|
228
|
+
contentVersion: buildContentVersion(),
|
|
229
|
+
buildId: process.env.BUILD_ID || process.env.TASK_ID || "local",
|
|
230
|
+
},
|
|
231
|
+
capabilities,
|
|
232
|
+
warnings,
|
|
233
|
+
});
|
|
234
|
+
await writeJson(path.join(root, "routes.json"), routes);
|
|
235
|
+
await writeJson(path.join(root, "middleware.json"), middleware);
|
|
236
|
+
await writeJson(path.join(root, "artifacts.json"), { artifacts });
|
|
237
|
+
await writeJson(path.join(root, "features.json"), {
|
|
238
|
+
features: [],
|
|
239
|
+
evjs: {
|
|
240
|
+
serverFunctions: serverManifest ? Object.keys(serverManifest.fns) : [],
|
|
241
|
+
routeHandlers: hasServerEntry(serverManifest) ? "degraded" : "unsupported",
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
await writeJson(path.join(root, "observability.json"), {
|
|
245
|
+
adapter: ADAPTER_PACKAGE,
|
|
246
|
+
framework: "evjs",
|
|
247
|
+
buildId: process.env.BUILD_ID || process.env.TASK_ID || "local",
|
|
248
|
+
});
|
|
249
|
+
await options.afterEmit?.({
|
|
250
|
+
outputDir: root,
|
|
251
|
+
serverFunctionName,
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
outputDir: root,
|
|
255
|
+
routes,
|
|
256
|
+
middleware,
|
|
257
|
+
artifacts,
|
|
258
|
+
capabilities,
|
|
259
|
+
warnings,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=emit.js.map
|
package/dist/emit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { build } from "./build.js";
|
|
2
|
+
export { detect } from "./detect.js";
|
|
3
|
+
export { emitUboa } from "./emit.js";
|
|
4
|
+
export { unio } from "./plugin.js";
|
|
5
|
+
export { validate } from "./validate.js";
|
|
6
|
+
export type { AdapterBuildResult, AfterEmitContext, BuildOptions, CapabilityStatus, ClientManifest, DetectResult, EmitUboaOptions, EvBuildResult, EvPlugin, EvPluginContext, EvPluginHooks, ExtendArtifactsContext, ExtendServerFunctionDescriptorContext, PageManifestEntry, RouteEntry, ServerFnEntry, ServerManifest, UboaApiSchemaArtifact, UboaApiSchemaFormat, UboaArtifact, UboaArtifactReference, UboaArtifactResourceKind, UboaAssetsArtifact, UboaCapabilities, UboaEdgeBundleArtifact, UboaEdgeFunctionRoute, UboaEdgeMiddleware, UboaMiddleware, UboaRoute, UboaServerFunctionDescriptor, UboaServerFunctionArtifact, UboaServerFunctionRoute, UboaServerlessMiddleware, UboaStaticRoute, UnioEvjsAdapterOptions, ValidationResult, } from "./types.js";
|
|
7
|
+
export { unio as default } from "./plugin.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { build } from "./build.js";
|
|
2
|
+
export { detect } from "./detect.js";
|
|
3
|
+
export { emitUboa } from "./emit.js";
|
|
4
|
+
export { unio } from "./plugin.js";
|
|
5
|
+
export { validate } from "./validate.js";
|
|
6
|
+
export { unio as default } from "./plugin.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAwCzC,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { isRecord, isStringArray } from "./utils.js";
|
|
2
|
+
function invalidManifest(kind, reason) {
|
|
3
|
+
return new Error(`Invalid EVJS ${kind} manifest: ${reason}`);
|
|
4
|
+
}
|
|
5
|
+
function assertRouteEntry(value, label) {
|
|
6
|
+
if (!isRecord(value) || typeof value.path !== "string") {
|
|
7
|
+
throw invalidManifest("client", `${label}.path must be a string`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function assertRoutes(value, label) {
|
|
11
|
+
if (!Array.isArray(value)) {
|
|
12
|
+
throw invalidManifest("client", `${label} must be an array`);
|
|
13
|
+
}
|
|
14
|
+
value.forEach((route, index) => {
|
|
15
|
+
assertRouteEntry(route, `${label}[${index}]`);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function assertPageManifestEntry(value, label) {
|
|
19
|
+
if (!isRecord(value)) {
|
|
20
|
+
throw invalidManifest("client", `${label} must be an object`);
|
|
21
|
+
}
|
|
22
|
+
assertAssets(value.assets, `${label}.assets`);
|
|
23
|
+
if (value.routes !== undefined) {
|
|
24
|
+
assertRoutes(value.routes, `${label}.routes`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function assertAssets(value, label) {
|
|
28
|
+
if (!isRecord(value)) {
|
|
29
|
+
throw invalidManifest("client", `${label} must be an object`);
|
|
30
|
+
}
|
|
31
|
+
if (!isStringArray(value.js)) {
|
|
32
|
+
throw invalidManifest("client", `${label}.js must be an array`);
|
|
33
|
+
}
|
|
34
|
+
if (!isStringArray(value.css)) {
|
|
35
|
+
throw invalidManifest("client", `${label}.css must be an array`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function assertClientManifest(value) {
|
|
39
|
+
if (!isRecord(value)) {
|
|
40
|
+
throw invalidManifest("client", "manifest must be an object");
|
|
41
|
+
}
|
|
42
|
+
if (value.version !== 1) {
|
|
43
|
+
throw invalidManifest("client", "version must be 1");
|
|
44
|
+
}
|
|
45
|
+
assertAssets(value.assets, "assets");
|
|
46
|
+
if (value.routes !== undefined) {
|
|
47
|
+
assertRoutes(value.routes, "routes");
|
|
48
|
+
}
|
|
49
|
+
if (value.pages !== undefined) {
|
|
50
|
+
if (!isRecord(value.pages)) {
|
|
51
|
+
throw invalidManifest("client", "pages must be an object");
|
|
52
|
+
}
|
|
53
|
+
for (const [pageName, page] of Object.entries(value.pages)) {
|
|
54
|
+
assertPageManifestEntry(page, `pages.${pageName}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function assertServerFnEntry(value, label) {
|
|
59
|
+
if (!isRecord(value)) {
|
|
60
|
+
throw invalidManifest("server", `${label} must be an object`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function assertServerManifest(value) {
|
|
64
|
+
if (!isRecord(value)) {
|
|
65
|
+
throw invalidManifest("server", "manifest must be an object");
|
|
66
|
+
}
|
|
67
|
+
if (value.version !== 1) {
|
|
68
|
+
throw invalidManifest("server", "version must be 1");
|
|
69
|
+
}
|
|
70
|
+
if (value.entry !== undefined && typeof value.entry !== "string") {
|
|
71
|
+
throw invalidManifest("server", "entry must be a string when present");
|
|
72
|
+
}
|
|
73
|
+
if (!isRecord(value.fns)) {
|
|
74
|
+
throw invalidManifest("server", "fns must be an object");
|
|
75
|
+
}
|
|
76
|
+
for (const [fnId, fnEntry] of Object.entries(value.fns)) {
|
|
77
|
+
assertServerFnEntry(fnEntry, `fns.${fnId}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AdapterBuildResult, EvPlugin, UnioEvjsAdapterOptions } from "./types.js";
|
|
2
|
+
export declare const UNIO_PLUGIN_NAME = "@unieojs/unio-evjs-adapter";
|
|
3
|
+
export declare function createUnioPlugin(options?: UnioEvjsAdapterOptions, onResult?: (result: AdapterBuildResult) => void): EvPlugin;
|
|
4
|
+
export declare function unio(options?: UnioEvjsAdapterOptions): EvPlugin;
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { emitUboa } from "./emit.js";
|
|
2
|
+
export const UNIO_PLUGIN_NAME = "@unieojs/unio-evjs-adapter";
|
|
3
|
+
export function createUnioPlugin(options = {}, onResult) {
|
|
4
|
+
return {
|
|
5
|
+
name: UNIO_PLUGIN_NAME,
|
|
6
|
+
setup(ctx) {
|
|
7
|
+
const cwd = options.cwd ?? ctx.cwd;
|
|
8
|
+
const isProductionBuild = ctx.mode === "production";
|
|
9
|
+
return {
|
|
10
|
+
async buildEnd(result) {
|
|
11
|
+
if (!isProductionBuild)
|
|
12
|
+
return;
|
|
13
|
+
const adapterResult = await emitUboa({
|
|
14
|
+
...options,
|
|
15
|
+
cwd,
|
|
16
|
+
clientManifest: result.clientManifest,
|
|
17
|
+
serverManifest: result.serverManifest,
|
|
18
|
+
});
|
|
19
|
+
onResult?.(adapterResult);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function unio(options = {}) {
|
|
26
|
+
return createUnioPlugin(options);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=plugin.js.map
|