@ketvietlab/ketjs 0.1.1
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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/agent/capabilities.d.ts +62 -0
- package/dist/agent/capabilities.d.ts.map +1 -0
- package/dist/agent/capabilities.js +89 -0
- package/dist/agent/capabilities.js.map +1 -0
- package/dist/agent/permissions.d.ts +56 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +209 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +698 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen/dts.d.ts +3 -0
- package/dist/codegen/dts.d.ts.map +1 -0
- package/dist/codegen/dts.js +94 -0
- package/dist/codegen/dts.js.map +1 -0
- package/dist/data/adapter.d.ts +4 -0
- package/dist/data/adapter.d.ts.map +1 -0
- package/dist/data/adapter.js +18 -0
- package/dist/data/adapter.js.map +1 -0
- package/dist/data/changeset.d.ts +49 -0
- package/dist/data/changeset.d.ts.map +1 -0
- package/dist/data/changeset.js +206 -0
- package/dist/data/changeset.js.map +1 -0
- package/dist/data/expr.d.ts +59 -0
- package/dist/data/expr.d.ts.map +1 -0
- package/dist/data/expr.js +61 -0
- package/dist/data/expr.js.map +1 -0
- package/dist/data/fleet.d.ts +28 -0
- package/dist/data/fleet.d.ts.map +1 -0
- package/dist/data/fleet.js +82 -0
- package/dist/data/fleet.js.map +1 -0
- package/dist/data/list-search.d.ts +93 -0
- package/dist/data/list-search.d.ts.map +1 -0
- package/dist/data/list-search.js +268 -0
- package/dist/data/list-search.js.map +1 -0
- package/dist/data/migrate.d.ts +75 -0
- package/dist/data/migrate.d.ts.map +1 -0
- package/dist/data/migrate.js +136 -0
- package/dist/data/migrate.js.map +1 -0
- package/dist/data/pool.d.ts +20 -0
- package/dist/data/pool.d.ts.map +1 -0
- package/dist/data/pool.js +92 -0
- package/dist/data/pool.js.map +1 -0
- package/dist/data/query.d.ts +111 -0
- package/dist/data/query.d.ts.map +1 -0
- package/dist/data/query.js +268 -0
- package/dist/data/query.js.map +1 -0
- package/dist/data/sqlite.d.ts +3 -0
- package/dist/data/sqlite.d.ts.map +1 -0
- package/dist/data/sqlite.js +107 -0
- package/dist/data/sqlite.js.map +1 -0
- package/dist/data/time.d.ts +9 -0
- package/dist/data/time.d.ts.map +1 -0
- package/dist/data/time.js +107 -0
- package/dist/data/time.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/apps.d.ts +43 -0
- package/dist/kernel/apps.d.ts.map +1 -0
- package/dist/kernel/apps.js +234 -0
- package/dist/kernel/apps.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +976 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/define.d.ts +9 -0
- package/dist/kernel/define.d.ts.map +1 -0
- package/dist/kernel/define.js +140 -0
- package/dist/kernel/define.js.map +1 -0
- package/dist/kernel/diff.d.ts +11 -0
- package/dist/kernel/diff.d.ts.map +1 -0
- package/dist/kernel/diff.js +106 -0
- package/dist/kernel/diff.js.map +1 -0
- package/dist/kernel/errors.d.ts +17 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +43 -0
- package/dist/kernel/errors.js.map +1 -0
- package/dist/kernel/graph.d.ts +3 -0
- package/dist/kernel/graph.d.ts.map +1 -0
- package/dist/kernel/graph.js +56 -0
- package/dist/kernel/graph.js.map +1 -0
- package/dist/kernel/i18n.d.ts +43 -0
- package/dist/kernel/i18n.d.ts.map +1 -0
- package/dist/kernel/i18n.js +79 -0
- package/dist/kernel/i18n.js.map +1 -0
- package/dist/kernel/index.d.ts +7 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +7 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/layout.d.ts +17 -0
- package/dist/kernel/layout.d.ts.map +1 -0
- package/dist/kernel/layout.js +77 -0
- package/dist/kernel/layout.js.map +1 -0
- package/dist/kernel/menu.d.ts +27 -0
- package/dist/kernel/menu.d.ts.map +1 -0
- package/dist/kernel/menu.js +65 -0
- package/dist/kernel/menu.js.map +1 -0
- package/dist/kernel/modules.d.ts +31 -0
- package/dist/kernel/modules.d.ts.map +1 -0
- package/dist/kernel/modules.js +322 -0
- package/dist/kernel/modules.js.map +1 -0
- package/dist/kernel/routes.d.ts +24 -0
- package/dist/kernel/routes.d.ts.map +1 -0
- package/dist/kernel/routes.js +98 -0
- package/dist/kernel/routes.js.map +1 -0
- package/dist/kernel/types.d.ts +8 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/types.js +67 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/workspace.d.ts +62 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/kernel/workspace.js +156 -0
- package/dist/kernel/workspace.js.map +1 -0
- package/dist/scaffold/index.d.ts +2 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +49 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
- package/dist/scaffold/templates/biome.json.tmpl +30 -0
- package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
- package/dist/scaffold/templates/gitignore.tmpl +24 -0
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
- package/dist/scaffold/templates/module.ts.tmpl +27 -0
- package/dist/scaffold/templates/package.json.tmpl +25 -0
- package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
- package/dist/server/boot.d.ts +173 -0
- package/dist/server/boot.d.ts.map +1 -0
- package/dist/server/boot.js +659 -0
- package/dist/server/boot.js.map +1 -0
- package/dist/server/config.d.ts +48 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +82 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/ctx.d.ts +13 -0
- package/dist/server/ctx.d.ts.map +1 -0
- package/dist/server/ctx.js +496 -0
- package/dist/server/ctx.js.map +1 -0
- package/dist/server/fn.d.ts +34 -0
- package/dist/server/fn.d.ts.map +1 -0
- package/dist/server/fn.js +170 -0
- package/dist/server/fn.js.map +1 -0
- package/dist/server/http.d.ts +79 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +459 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/idem.d.ts +31 -0
- package/dist/server/idem.d.ts.map +1 -0
- package/dist/server/idem.js +68 -0
- package/dist/server/idem.js.map +1 -0
- package/dist/server/jobs.d.ts +5 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +24 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/multipart.d.ts +18 -0
- package/dist/server/multipart.d.ts.map +1 -0
- package/dist/server/multipart.js +183 -0
- package/dist/server/multipart.js.map +1 -0
- package/dist/server/project.d.ts +9 -0
- package/dist/server/project.d.ts.map +1 -0
- package/dist/server/project.js +67 -0
- package/dist/server/project.js.map +1 -0
- package/dist/server/queue.d.ts +80 -0
- package/dist/server/queue.d.ts.map +1 -0
- package/dist/server/queue.js +494 -0
- package/dist/server/queue.js.map +1 -0
- package/dist/server/respond.d.ts +91 -0
- package/dist/server/respond.d.ts.map +1 -0
- package/dist/server/respond.js +99 -0
- package/dist/server/respond.js.map +1 -0
- package/dist/server/runtime.d.ts +14 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +25 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/session.d.ts +55 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +172 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/sessionstore.d.ts +54 -0
- package/dist/server/sessionstore.d.ts.map +1 -0
- package/dist/server/sessionstore.js +232 -0
- package/dist/server/sessionstore.js.map +1 -0
- package/dist/server/storage/index.d.ts +11 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +31 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/local.d.ts +5 -0
- package/dist/server/storage/local.d.ts.map +1 -0
- package/dist/server/storage/local.js +165 -0
- package/dist/server/storage/local.js.map +1 -0
- package/dist/server/storage/s3.d.ts +11 -0
- package/dist/server/storage/s3.d.ts.map +1 -0
- package/dist/server/storage/s3.js +133 -0
- package/dist/server/storage/s3.js.map +1 -0
- package/dist/server/storage/sigv4.d.ts +23 -0
- package/dist/server/storage/sigv4.d.ts.map +1 -0
- package/dist/server/storage/sigv4.js +79 -0
- package/dist/server/storage/sigv4.js.map +1 -0
- package/dist/server/storage/types.d.ts +37 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +82 -0
- package/dist/server/storage/types.js.map +1 -0
- package/dist/server/stream.d.ts +43 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +117 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/streamstore.d.ts +29 -0
- package/dist/server/streamstore.d.ts.map +1 -0
- package/dist/server/streamstore.js +140 -0
- package/dist/server/streamstore.js.map +1 -0
- package/dist/server/tenants.d.ts +108 -0
- package/dist/server/tenants.d.ts.map +1 -0
- package/dist/server/tenants.js +172 -0
- package/dist/server/tenants.js.map +1 -0
- package/dist/server/transport/index.d.ts +5 -0
- package/dist/server/transport/index.d.ts.map +1 -0
- package/dist/server/transport/index.js +3 -0
- package/dist/server/transport/index.js.map +1 -0
- package/dist/server/transport/memory.d.ts +14 -0
- package/dist/server/transport/memory.d.ts.map +1 -0
- package/dist/server/transport/memory.js +36 -0
- package/dist/server/transport/memory.js.map +1 -0
- package/dist/server/transport/types.d.ts +44 -0
- package/dist/server/transport/types.d.ts.map +1 -0
- package/dist/server/transport/types.js +79 -0
- package/dist/server/transport/types.js.map +1 -0
- package/dist/server/worker.d.ts +33 -0
- package/dist/server/worker.d.ts.map +1 -0
- package/dist/server/worker.js +428 -0
- package/dist/server/worker.js.map +1 -0
- package/dist/testing.d.ts +146 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +406 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme/contracts.d.ts +4 -0
- package/dist/theme/contracts.d.ts.map +1 -0
- package/dist/theme/contracts.js +87 -0
- package/dist/theme/contracts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +7 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/joints.d.ts +19 -0
- package/dist/theme/joints.d.ts.map +1 -0
- package/dist/theme/joints.js +126 -0
- package/dist/theme/joints.js.map +1 -0
- package/dist/theme/ktl/compile.d.ts +26 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -0
- package/dist/theme/ktl/compile.js +226 -0
- package/dist/theme/ktl/compile.js.map +1 -0
- package/dist/theme/ktl/lexer.d.ts +20 -0
- package/dist/theme/ktl/lexer.d.ts.map +1 -0
- package/dist/theme/ktl/lexer.js +56 -0
- package/dist/theme/ktl/lexer.js.map +1 -0
- package/dist/theme/ktl/parser.d.ts +64 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -0
- package/dist/theme/ktl/parser.js +220 -0
- package/dist/theme/ktl/parser.js.map +1 -0
- package/dist/theme/render.d.ts +19 -0
- package/dist/theme/render.d.ts.map +1 -0
- package/dist/theme/render.js +246 -0
- package/dist/theme/render.js.map +1 -0
- package/dist/theme/templates.d.ts +2 -0
- package/dist/theme/templates.d.ts.map +1 -0
- package/dist/theme/templates.js +40 -0
- package/dist/theme/templates.js.map +1 -0
- package/dist/theme/tokens.d.ts +4 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +15 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme/viewmodel.d.ts +6 -0
- package/dist/theme/viewmodel.d.ts.map +1 -0
- package/dist/theme/viewmodel.js +40 -0
- package/dist/theme/viewmodel.js.map +1 -0
- package/dist/types.d.ts +614 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// Filesystem module discovery, kept entirely at the workspace boundary.
|
|
2
|
+
//
|
|
3
|
+
// Odoo's addons_path gets one thing exactly right: a deployment may draw modules
|
|
4
|
+
// from several roots without teaching the application where every package lives.
|
|
5
|
+
// Ket keeps the useful half and rejects the dangerous half. Discovery builds a
|
|
6
|
+
// catalogue, explicitly selected modules and their dependency closure are loaded,
|
|
7
|
+
// and everything below this file still receives ordinary KetModule objects.
|
|
8
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
9
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
10
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
11
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return path;
|
|
15
|
+
};
|
|
16
|
+
import { realpath, readdir, readFile, stat } from 'node:fs/promises';
|
|
17
|
+
import { dirname, extname, isAbsolute, relative, resolve, sep } from 'node:path';
|
|
18
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
19
|
+
import { KetError } from './errors.js';
|
|
20
|
+
import { topoSort } from './graph.js';
|
|
21
|
+
const DESCRIPTOR = 'ket.module.json';
|
|
22
|
+
const NAME = /^[a-z][a-z0-9_]*$/;
|
|
23
|
+
const ARTIFACT_EXTENSIONS = new Set(['.js', '.mjs', '.cjs']);
|
|
24
|
+
const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts']);
|
|
25
|
+
const DISCOVERY_CONCURRENCY = 64;
|
|
26
|
+
const fail = (code, message, hint) => {
|
|
27
|
+
throw new KetError({ code, message, ...(hint ? { hint } : {}) });
|
|
28
|
+
};
|
|
29
|
+
const inside = (parent, child) => {
|
|
30
|
+
const rel = relative(parent, child);
|
|
31
|
+
return rel === '' || (!rel.startsWith(`..${sep}`) && rel !== '..' && !isAbsolute(rel));
|
|
32
|
+
};
|
|
33
|
+
const rootPath = (value, baseUrl) => {
|
|
34
|
+
if (value instanceof URL) {
|
|
35
|
+
if (value.protocol !== 'file:')
|
|
36
|
+
return fail('E_MODULE_PATH_PROTOCOL', `module path must be a file URL, got "${value.protocol}"`);
|
|
37
|
+
return fileURLToPath(value);
|
|
38
|
+
}
|
|
39
|
+
if (typeof value !== 'string' || !value.trim())
|
|
40
|
+
return fail('E_MODULE_PATH', 'module path must be a non-empty path or file URL');
|
|
41
|
+
if (isAbsolute(value))
|
|
42
|
+
return value;
|
|
43
|
+
if (baseUrl.protocol !== 'file:')
|
|
44
|
+
return fail('E_MODULE_PATH_PROTOCOL', `workspace base URL must be file:, got "${baseUrl.protocol}"`);
|
|
45
|
+
return resolve(dirname(fileURLToPath(baseUrl)), value);
|
|
46
|
+
};
|
|
47
|
+
const readDescriptor = async (path) => {
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(await readFile(path, 'utf8'));
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return fail('E_MODULE_DESCRIPTOR', `cannot read module descriptor at ${path}: ${error.message}`, `${DESCRIPTOR} must be valid JSON`);
|
|
54
|
+
}
|
|
55
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
56
|
+
return fail('E_MODULE_DESCRIPTOR', `${path} must contain a JSON object`);
|
|
57
|
+
const value = parsed;
|
|
58
|
+
const unknown = Object.keys(value).filter((key) => !['$schema', 'name', 'entry'].includes(key));
|
|
59
|
+
if (unknown.length)
|
|
60
|
+
return fail('E_MODULE_DESCRIPTOR_KEY', `${path} declares unknown ${unknown.length === 1 ? 'key' : 'keys'}: ${unknown.join(', ')}`, 'known keys: $schema, name, entry');
|
|
61
|
+
if (typeof value.name !== 'string' || !NAME.test(value.name))
|
|
62
|
+
return fail('E_MODULE_DESCRIPTOR_NAME', `${path} has invalid module name ${JSON.stringify(value.name)}`, 'use lowercase letters, digits and underscore, starting with a letter');
|
|
63
|
+
if (typeof value.entry !== 'string' || !value.entry.trim())
|
|
64
|
+
return fail('E_MODULE_DESCRIPTOR_ENTRY', `${path} needs a non-empty "entry"`);
|
|
65
|
+
return { name: value.name, entry: value.entry };
|
|
66
|
+
};
|
|
67
|
+
async function scanModulePaths(paths, options) {
|
|
68
|
+
const roots = [];
|
|
69
|
+
const catalog = new Map();
|
|
70
|
+
for (const configured of paths) {
|
|
71
|
+
const raw = rootPath(configured, options.baseUrl);
|
|
72
|
+
let root = raw;
|
|
73
|
+
try {
|
|
74
|
+
root = await realpath(raw);
|
|
75
|
+
if (!(await stat(root)).isDirectory())
|
|
76
|
+
fail('E_MODULE_PATH_NOT_DIRECTORY', `module path is not a directory: ${raw}`);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof KetError)
|
|
80
|
+
throw error;
|
|
81
|
+
fail('E_MODULE_PATH_MISSING', `module path does not exist: ${raw}`);
|
|
82
|
+
}
|
|
83
|
+
if (roots.includes(root))
|
|
84
|
+
continue;
|
|
85
|
+
roots.push(root);
|
|
86
|
+
const children = (await readdir(root, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
|
|
87
|
+
// Filesystem latency, not graph work, dominates a broad catalogue. Probe the
|
|
88
|
+
// sorted children concurrently, then consume settled results in that same
|
|
89
|
+
// order so an invalid catalogue still reports deterministically.
|
|
90
|
+
const probe = async (child) => {
|
|
91
|
+
if (!child.isDirectory() && !child.isSymbolicLink())
|
|
92
|
+
return null;
|
|
93
|
+
const moduleDir = resolve(root, child.name);
|
|
94
|
+
let moduleRoot;
|
|
95
|
+
try {
|
|
96
|
+
moduleRoot = await realpath(moduleDir);
|
|
97
|
+
if (!(await stat(moduleRoot)).isDirectory())
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const descriptorPath = resolve(moduleRoot, DESCRIPTOR);
|
|
104
|
+
try {
|
|
105
|
+
if (!(await stat(descriptorPath)).isFile())
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const descriptor = await readDescriptor(descriptorPath);
|
|
112
|
+
const unresolvedEntry = resolve(moduleRoot, descriptor.entry);
|
|
113
|
+
let entry = unresolvedEntry;
|
|
114
|
+
try {
|
|
115
|
+
entry = await realpath(unresolvedEntry);
|
|
116
|
+
if (!(await stat(entry)).isFile())
|
|
117
|
+
fail('E_MODULE_ENTRY_NOT_FILE', `module "${descriptor.name}" entry is not a file: ${unresolvedEntry}`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof KetError)
|
|
121
|
+
throw error;
|
|
122
|
+
fail('E_MODULE_ENTRY_MISSING', `module "${descriptor.name}" entry does not exist: ${unresolvedEntry}`);
|
|
123
|
+
}
|
|
124
|
+
if (!inside(moduleRoot, entry))
|
|
125
|
+
fail('E_MODULE_ENTRY_ESCAPE', `module "${descriptor.name}" entry escapes its module directory: ${descriptor.entry}`);
|
|
126
|
+
const extension = extname(entry).toLowerCase();
|
|
127
|
+
if (!ARTIFACT_EXTENSIONS.has(extension) && !(options.allowSource && SOURCE_EXTENSIONS.has(extension)))
|
|
128
|
+
fail('E_MODULE_ENTRY_EXTENSION', `module "${descriptor.name}" entry ${descriptor.entry} is not an executable JavaScript artifact`, options.allowSource
|
|
129
|
+
? 'use .js/.mjs/.cjs, or .ts/.tsx/.mts/.cts through the development loader'
|
|
130
|
+
: 'build the module first and point entry at .js, .mjs or .cjs');
|
|
131
|
+
return { name: descriptor.name, descriptor: descriptorPath, entry, root: moduleRoot };
|
|
132
|
+
};
|
|
133
|
+
for (let offset = 0; offset < children.length; offset += DISCOVERY_CONCURRENCY) {
|
|
134
|
+
const discovered = await Promise.allSettled(children.slice(offset, offset + DISCOVERY_CONCURRENCY).map(probe));
|
|
135
|
+
for (const result of discovered) {
|
|
136
|
+
if (result.status === 'rejected')
|
|
137
|
+
throw result.reason;
|
|
138
|
+
const source = result.value;
|
|
139
|
+
if (!source)
|
|
140
|
+
continue;
|
|
141
|
+
const existing = catalog.get(source.name);
|
|
142
|
+
if (existing)
|
|
143
|
+
fail('E_MODULE_NAME_CLASH', `module "${source.name}" is provided by both ${existing.root} and ${source.root}`, 'module roots never shadow each other; rename one module or remove one root');
|
|
144
|
+
catalog.set(source.name, source);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { roots, catalog };
|
|
149
|
+
}
|
|
150
|
+
const assertModule = (value, source) => {
|
|
151
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
152
|
+
return fail('E_MODULE_EXPORT', `${source.entry} must default-export a module created by defineModule()`);
|
|
153
|
+
const module = value;
|
|
154
|
+
if (module.name !== source.name)
|
|
155
|
+
return fail('E_MODULE_IDENTITY_MISMATCH', `${source.descriptor} names module "${source.name}" but ${source.entry} exports ${JSON.stringify(module.name)}`);
|
|
156
|
+
if (module.kind !== 'module' && module.kind !== 'theme')
|
|
157
|
+
return fail('E_MODULE_EXPORT', `module "${source.name}" has invalid kind ${JSON.stringify(module.kind)}`);
|
|
158
|
+
if (typeof module.version !== 'string')
|
|
159
|
+
return fail('E_MODULE_EXPORT', `module "${source.name}" must declare a string version`);
|
|
160
|
+
if (!Array.isArray(module.depends) || module.depends.some((name) => typeof name !== 'string'))
|
|
161
|
+
return fail('E_MODULE_EXPORT', `module "${source.name}" must declare a string dependency list`);
|
|
162
|
+
for (const key of ['requires', 'provides', 'styles', 'omits']) {
|
|
163
|
+
const field = module[key];
|
|
164
|
+
if (!Array.isArray(field) || field.some((value) => typeof value !== 'string'))
|
|
165
|
+
return fail('E_MODULE_EXPORT', `module "${source.name}" has invalid "${key}"; export defineModule(...)`);
|
|
166
|
+
}
|
|
167
|
+
for (const key of [
|
|
168
|
+
'models',
|
|
169
|
+
'extend',
|
|
170
|
+
'joints',
|
|
171
|
+
'fills',
|
|
172
|
+
'functions',
|
|
173
|
+
'jobs',
|
|
174
|
+
'views',
|
|
175
|
+
'tokens',
|
|
176
|
+
'templates',
|
|
177
|
+
'routes',
|
|
178
|
+
'menus',
|
|
179
|
+
'islands',
|
|
180
|
+
'sections',
|
|
181
|
+
'relations',
|
|
182
|
+
'messages',
|
|
183
|
+
]) {
|
|
184
|
+
const field = module[key];
|
|
185
|
+
if (!field || typeof field !== 'object' || Array.isArray(field))
|
|
186
|
+
return fail('E_MODULE_EXPORT', `module "${source.name}" has invalid "${key}"; export defineModule(...)`);
|
|
187
|
+
}
|
|
188
|
+
return value;
|
|
189
|
+
};
|
|
190
|
+
const moduleName = (ref) => (typeof ref === 'string' ? ref : ref.name);
|
|
191
|
+
async function resolveApp(declaration, catalog, imports) {
|
|
192
|
+
const inline = new Map();
|
|
193
|
+
const stringRefs = new Set();
|
|
194
|
+
const refs = [
|
|
195
|
+
...declaration.modules,
|
|
196
|
+
...(declaration.theme ? [declaration.theme] : []),
|
|
197
|
+
...(declaration.themes ?? []),
|
|
198
|
+
];
|
|
199
|
+
for (const ref of refs) {
|
|
200
|
+
if (typeof ref === 'string') {
|
|
201
|
+
if (!NAME.test(ref))
|
|
202
|
+
fail('E_MODULE_REF', `app "${declaration.name}" has invalid module reference ${JSON.stringify(ref)}`, 'use the snake_case name from ket.module.json');
|
|
203
|
+
if (stringRefs.has(ref))
|
|
204
|
+
fail('E_MODULE_DUPLICATE_REF', `app "${declaration.name}" references module "${ref}" more than once`);
|
|
205
|
+
stringRefs.add(ref);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const existing = inline.get(ref.name);
|
|
209
|
+
if (existing)
|
|
210
|
+
fail('E_MODULE_NAME_CLASH', `app "${declaration.name}" contains two inline modules named "${ref.name}"`, 'each app must ship exactly one implementation of a module name');
|
|
211
|
+
inline.set(ref.name, ref);
|
|
212
|
+
}
|
|
213
|
+
for (const name of stringRefs) {
|
|
214
|
+
if (inline.has(name))
|
|
215
|
+
fail('E_MODULE_NAME_CLASH', `app "${declaration.name}" provides "${name}" inline and by module path`, 'choose the imported module object or its string reference, not both');
|
|
216
|
+
}
|
|
217
|
+
const resolved = new Map();
|
|
218
|
+
const sources = new Map();
|
|
219
|
+
const visiting = new Set();
|
|
220
|
+
const load = async (name) => {
|
|
221
|
+
if (resolved.has(name))
|
|
222
|
+
return;
|
|
223
|
+
let module = inline.get(name);
|
|
224
|
+
let source = null;
|
|
225
|
+
if (!module) {
|
|
226
|
+
const found = catalog.get(name);
|
|
227
|
+
if (!found) {
|
|
228
|
+
throw new KetError({
|
|
229
|
+
code: 'E_MISSING_DEPENDENCY',
|
|
230
|
+
message: `app "${declaration.name}" needs module "${name}", which no module path provides`,
|
|
231
|
+
hint: `add a root containing "${name}" to modulePaths, or import it into the app`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
source = found;
|
|
235
|
+
let pending = imports.get(found.entry);
|
|
236
|
+
if (!pending) {
|
|
237
|
+
pending = import(__rewriteRelativeImportExtension(pathToFileURL(found.entry).href)).then((namespace) => assertModule(namespace.default, found));
|
|
238
|
+
imports.set(found.entry, pending);
|
|
239
|
+
}
|
|
240
|
+
module = await pending;
|
|
241
|
+
}
|
|
242
|
+
resolved.set(name, module);
|
|
243
|
+
sources.set(name, source);
|
|
244
|
+
if (visiting.has(name))
|
|
245
|
+
return;
|
|
246
|
+
visiting.add(name);
|
|
247
|
+
for (const dependency of module.depends)
|
|
248
|
+
await load(dependency);
|
|
249
|
+
visiting.delete(name);
|
|
250
|
+
};
|
|
251
|
+
for (const ref of declaration.modules)
|
|
252
|
+
await load(moduleName(ref));
|
|
253
|
+
if (declaration.theme)
|
|
254
|
+
await load(moduleName(declaration.theme));
|
|
255
|
+
for (const theme of declaration.themes ?? [])
|
|
256
|
+
await load(moduleName(theme));
|
|
257
|
+
// topoSort remains the one authority for missing dependencies and cycles. It
|
|
258
|
+
// also makes registration order independent of filesystem/readdir order.
|
|
259
|
+
const ordered = topoSort([...resolved.values()]);
|
|
260
|
+
const themeName = declaration.theme ? moduleName(declaration.theme) : null;
|
|
261
|
+
const theme = themeName ? resolved.get(themeName) : undefined;
|
|
262
|
+
const selectedThemes = [
|
|
263
|
+
...(theme ? [theme] : []),
|
|
264
|
+
...(declaration.themes ?? []).map((ref) => resolved.get(moduleName(ref))),
|
|
265
|
+
];
|
|
266
|
+
for (const selected of selectedThemes)
|
|
267
|
+
if (selected.kind !== 'theme')
|
|
268
|
+
fail('E_APP_THEME_KIND', `app "${declaration.name}" selects "${selected.name}" as a theme, but it is a ${selected.kind}`, 'export it with defineTheme(), or move it into modules');
|
|
269
|
+
const selectedNames = new Set(selectedThemes.map((selected) => selected.name));
|
|
270
|
+
const modules = ordered.filter((module) => !selectedNames.has(module.name));
|
|
271
|
+
const { modules: _moduleRefs, theme: _themeRef, themes: _themeRefs, ...app } = declaration;
|
|
272
|
+
return {
|
|
273
|
+
spec: {
|
|
274
|
+
...app,
|
|
275
|
+
modules,
|
|
276
|
+
...(theme ? { theme } : {}),
|
|
277
|
+
...(selectedThemes.length ? { themes: selectedThemes.filter((item) => item !== theme) } : {}),
|
|
278
|
+
},
|
|
279
|
+
sources,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/** Resolve an authored workspace into the object-only shape the runtime accepts. */
|
|
283
|
+
export async function resolveWorkspace(declaration, options) {
|
|
284
|
+
if (!declaration || !Array.isArray(declaration.apps))
|
|
285
|
+
fail('E_WORKSPACE_SHAPE', 'workspace must contain an apps array');
|
|
286
|
+
const configured = [...(declaration.modulePaths ?? []), ...(options.extraModulePaths ?? [])];
|
|
287
|
+
const { roots, catalog } = await scanModulePaths(configured, options);
|
|
288
|
+
const imports = new Map();
|
|
289
|
+
const apps = [];
|
|
290
|
+
const inventory = new Map();
|
|
291
|
+
for (const app of declaration.apps) {
|
|
292
|
+
const { spec, sources } = await resolveApp(app, catalog, imports);
|
|
293
|
+
apps.push(spec);
|
|
294
|
+
for (const module of [...spec.modules, ...(spec.theme ? [spec.theme] : []), ...(spec.themes ?? [])]) {
|
|
295
|
+
const source = sources.get(module.name);
|
|
296
|
+
const label = source?.entry ?? 'workspace';
|
|
297
|
+
const key = `${module.name}\0${module.version}\0${label}`;
|
|
298
|
+
const existing = inventory.get(key);
|
|
299
|
+
if (existing) {
|
|
300
|
+
if (!existing.apps.includes(spec.name))
|
|
301
|
+
existing.apps.push(spec.name);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
inventory.set(key, {
|
|
305
|
+
name: module.name,
|
|
306
|
+
version: module.version,
|
|
307
|
+
kind: module.kind,
|
|
308
|
+
source: label,
|
|
309
|
+
apps: [spec.name],
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
apps,
|
|
316
|
+
modulePaths: roots,
|
|
317
|
+
modules: [...inventory.values()].sort((a, b) => a.name.localeCompare(b.name) ||
|
|
318
|
+
a.version.localeCompare(b.version) ||
|
|
319
|
+
a.source.localeCompare(b.source)),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/modules.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,4EAA4E;;;;;;;;;AAE5E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,UAAU,GAAG,iBAAiB,CAAA;AACpC,MAAM,IAAI,GAAG,mBAAmB,CAAA;AAChC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAClE,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAqChC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,IAAa,EAAS,EAAE;IACnE,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,KAAa,EAAW,EAAE;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACnC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAE,OAAY,EAAU,EAAE;IAC3D,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO;YAC5B,OAAO,IAAI,CAAC,wBAAwB,EAAE,wCAAwC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAA;QAClG,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAC5C,OAAO,IAAI,CAAC,eAAe,EAAE,kDAAkD,CAAC,CAAA;IAClF,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC9B,OAAO,IAAI,CAAC,wBAAwB,EAAE,0CAA0C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtG,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AACxD,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,KAAK,EAAE,IAAY,EAA6B,EAAE;IACvE,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CACT,qBAAqB,EACrB,oCAAoC,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EACvE,GAAG,UAAU,qBAAqB,CACnC,CAAA;IACH,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAChE,OAAO,IAAI,CAAC,qBAAqB,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,MAAiC,CAAA;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/F,IAAI,OAAO,CAAC,MAAM;QAChB,OAAO,IAAI,CACT,yBAAyB,EACzB,GAAG,IAAI,qBAAqB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC1F,kCAAkC,CACnC,CAAA;IACH,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1D,OAAO,IAAI,CACT,0BAA0B,EAC1B,GAAG,IAAI,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAC/D,sEAAsE,CACvE,CAAA;IACH,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QACxD,OAAO,IAAI,CAAC,2BAA2B,EAAE,GAAG,IAAI,4BAA4B,CAAC,CAAA;IAC/E,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;AACjD,CAAC,CAAA;AAED,KAAK,UAAU,eAAe,CAC5B,KAA4B,EAC5B,OAAiE;IAEjE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAA;IAE/C,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QACjD,IAAI,IAAI,GAAG,GAAG,CAAA;QACd,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBACnC,IAAI,CAAC,6BAA6B,EAAE,mCAAmC,GAAG,EAAE,CAAC,CAAA;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ;gBAAE,MAAM,KAAK,CAAA;YAC1C,IAAI,CAAC,uBAAuB,EAAE,+BAA+B,GAAG,EAAE,CAAC,CAAA;QACrE,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEhB,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5E,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7B,CAAA;QACD,6EAA6E;QAC7E,0EAA0E;QAC1E,iEAAiE;QACjE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAgC,EAAgC,EAAE;YACrF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;gBAAE,OAAO,IAAI,CAAA;YAChE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,UAAkB,CAAA;YACtB,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACtC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE;oBAAE,OAAO,IAAI,CAAA;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;YACD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YACtD,IAAI,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,IAAI,CAAA;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAA;YACvD,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;YAC7D,IAAI,KAAK,GAAG,eAAe,CAAA;YAC3B,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAA;gBACvC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;oBAC/B,IAAI,CACF,yBAAyB,EACzB,WAAW,UAAU,CAAC,IAAI,0BAA0B,eAAe,EAAE,CACtE,CAAA;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,QAAQ;oBAAE,MAAM,KAAK,CAAA;gBAC1C,IAAI,CAAC,wBAAwB,EAAE,WAAW,UAAU,CAAC,IAAI,2BAA2B,eAAe,EAAE,CAAC,CAAA;YACxG,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC;gBAC5B,IAAI,CACF,uBAAuB,EACvB,WAAW,UAAU,CAAC,IAAI,yCAAyC,UAAU,CAAC,KAAK,EAAE,CACtF,CAAA;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YAC9C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACnG,IAAI,CACF,0BAA0B,EAC1B,WAAW,UAAU,CAAC,IAAI,WAAW,UAAU,CAAC,KAAK,2CAA2C,EAChG,OAAO,CAAC,WAAW;oBACjB,CAAC,CAAC,yEAAyE;oBAC3E,CAAC,CAAC,6DAA6D,CAClE,CAAA;YAEH,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;QACvF,CAAC,CAAA;QACD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;YAC/E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,CACzC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAClE,CAAA;YACD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;gBAChC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;oBAAE,MAAM,MAAM,CAAC,MAAM,CAAA;gBACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC3B,IAAI,CAAC,MAAM;oBAAE,SAAQ;gBACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzC,IAAI,QAAQ;oBACV,IAAI,CACF,qBAAqB,EACrB,WAAW,MAAM,CAAC,IAAI,yBAAyB,QAAQ,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,EAAE,EACjF,4EAA4E,CAC7E,CAAA;gBACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,MAAoB,EAAa,EAAE;IACvE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7D,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,MAAM,CAAC,KAAK,yDAAyD,CAAC,CAAA;IAC1G,MAAM,MAAM,GAAG,KAA2B,CAAA;IAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QAC7B,OAAO,IAAI,CACT,4BAA4B,EAC5B,GAAG,MAAM,CAAC,UAAU,kBAAkB,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAChH,CAAA;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QACrD,OAAO,IAAI,CAAC,iBAAiB,EAAE,WAAW,MAAM,CAAC,IAAI,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3G,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QACpC,OAAO,IAAI,CAAC,iBAAiB,EAAE,WAAW,MAAM,CAAC,IAAI,iCAAiC,CAAC,CAAA;IACzF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QAC3F,OAAO,IAAI,CAAC,iBAAiB,EAAE,WAAW,MAAM,CAAC,IAAI,yCAAyC,CAAC,CAAA;IACjG,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;YAC3E,OAAO,IAAI,CAAC,iBAAiB,EAAE,WAAW,MAAM,CAAC,IAAI,kBAAkB,GAAG,6BAA6B,CAAC,CAAA;IAC5G,CAAC;IACD,KAAK,MAAM,GAAG,IAAI;QAChB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,WAAW;QACX,MAAM;QACN,OAAO;QACP,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,OAAO;QACP,SAAS;QACT,UAAU;QACV,WAAW;QACX,UAAU;KACF,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7D,OAAO,IAAI,CAAC,iBAAiB,EAAE,WAAW,MAAM,CAAC,IAAI,kBAAkB,GAAG,6BAA6B,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,KAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,GAAc,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAEzF,KAAK,UAAU,UAAU,CACvB,WAA2B,EAC3B,OAAkC,EAClC,OAAwC;IAExC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,MAAM,IAAI,GAAG;QACX,GAAG,WAAW,CAAC,OAAO;QACtB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;KAC9B,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjB,IAAI,CACF,cAAc,EACd,QAAQ,WAAW,CAAC,IAAI,kCAAkC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAC/E,8CAA8C,CAC/C,CAAA;YACH,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBACrB,IAAI,CAAC,wBAAwB,EAAE,QAAQ,WAAW,CAAC,IAAI,wBAAwB,GAAG,kBAAkB,CAAC,CAAA;YACvG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,QAAQ;YACV,IAAI,CACF,qBAAqB,EACrB,QAAQ,WAAW,CAAC,IAAI,wCAAwC,GAAG,CAAC,IAAI,GAAG,EAC3E,gEAAgE,CACjE,CAAA;QACH,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAClB,IAAI,CACF,qBAAqB,EACrB,QAAQ,WAAW,CAAC,IAAI,eAAe,IAAI,6BAA6B,EACxE,qEAAqE,CACtE,CAAA;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAA;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAElC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;QACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAM;QAC9B,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,MAAM,GAAwB,IAAI,CAAA;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,QAAQ,CAAC;oBACjB,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,QAAQ,WAAW,CAAC,IAAI,mBAAmB,IAAI,kCAAkC;oBAC1F,IAAI,EAAE,0BAA0B,IAAI,6CAA6C;iBAClF,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,GAAG,KAAK,CAAA;YACd,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,MAAM,kCAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAC,CAAC,IAAI,CAAC,CAAC,SAAkC,EAAE,EAAE,CAC5F,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CACvC,CAAA;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACnC,CAAC;YACD,MAAM,GAAG,MAAM,OAAO,CAAA;QACxB,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAM;QAC9B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAClB,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO;QAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IAClE,IAAI,WAAW,CAAC,KAAK;QAAE,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE;QAAE,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAE3E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7D,MAAM,cAAc,GAAG;QACrB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAE,CAAC;KAC3E,CAAA;IACD,KAAK,MAAM,QAAQ,IAAI,cAAc;QACnC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;YAC3B,IAAI,CACF,kBAAkB,EAClB,QAAQ,WAAW,CAAC,IAAI,cAAc,QAAQ,CAAC,IAAI,6BAA6B,QAAQ,CAAC,IAAI,EAAE,EAC/F,uDAAuD,CACxD,CAAA;IACL,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3E,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,WAAW,CAAA;IAC1F,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,GAAG;YACN,OAAO;YACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9F;QACD,OAAO;KACR,CAAA;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAiC,EACjC,OAAgC;IAEhC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;QAClD,IAAI,CAAC,mBAAmB,EAAE,sCAAsC,CAAC,CAAA;IACnE,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAA;IAC5F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAA;IACrD,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAA;IAEvD,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACjE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACpG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,WAAW,CAAA;YAC1C,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAA;YACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvE,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBAClB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YAClC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CACnC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type RouteParams = Readonly<Record<string, string>>;
|
|
2
|
+
type Segment = {
|
|
3
|
+
kind: 'static';
|
|
4
|
+
value: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'param';
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
export type RoutePattern = {
|
|
10
|
+
path: string;
|
|
11
|
+
segments: readonly Segment[];
|
|
12
|
+
staticCount: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseRoutePattern(path: string): RoutePattern;
|
|
15
|
+
/** True when both patterns can match one pathname and neither is more specific. */
|
|
16
|
+
export declare function ambiguousRoutes(a: RoutePattern, b: RoutePattern): boolean;
|
|
17
|
+
export declare function matchRoutePattern(pattern: RoutePattern, pathname: string): RouteParams | null;
|
|
18
|
+
export declare function compileRoutes<T>(routes: Record<string, T>): (pathname: string) => {
|
|
19
|
+
path: string;
|
|
20
|
+
value: T;
|
|
21
|
+
params: RouteParams;
|
|
22
|
+
} | null;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/routes.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1D,KAAK,OAAO,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA6B5D;AAaD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAMzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAc7F;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK;IACjF,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,CAAC,CAAA;IACR,MAAM,EAAE,WAAW,CAAA;CACpB,GAAG,IAAI,CA4BP"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { KetError } from './errors.js';
|
|
2
|
+
const PARAM = /^\{([A-Za-z_][A-Za-z0-9_]*)\}$/;
|
|
3
|
+
export function parseRoutePattern(path) {
|
|
4
|
+
if (!path.startsWith('/')) {
|
|
5
|
+
throw new KetError({ code: 'E_ROUTE_PATH', message: `route "${path}" must start with "/"` });
|
|
6
|
+
}
|
|
7
|
+
const names = new Set();
|
|
8
|
+
const parts = path === '/' ? [] : path.slice(1).split('/');
|
|
9
|
+
const segments = parts.map((part) => {
|
|
10
|
+
const param = PARAM.exec(part);
|
|
11
|
+
if (param) {
|
|
12
|
+
const name = param[1];
|
|
13
|
+
if (names.has(name)) {
|
|
14
|
+
throw new KetError({
|
|
15
|
+
code: 'E_ROUTE_PARAM_DUPLICATE',
|
|
16
|
+
message: `route "${path}" declares parameter "${name}" more than once`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
names.add(name);
|
|
20
|
+
return { kind: 'param', name };
|
|
21
|
+
}
|
|
22
|
+
if (part.includes('{') || part.includes('}')) {
|
|
23
|
+
throw new KetError({
|
|
24
|
+
code: 'E_ROUTE_PATTERN',
|
|
25
|
+
message: `route "${path}" has an invalid dynamic segment "${part}"`,
|
|
26
|
+
hint: 'a dynamic segment occupies the whole segment, for example /products/{slug}',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return { kind: 'static', value: decode(part, path) };
|
|
30
|
+
});
|
|
31
|
+
return { path, segments, staticCount: segments.filter((s) => s.kind === 'static').length };
|
|
32
|
+
}
|
|
33
|
+
const decode = (part, path) => {
|
|
34
|
+
try {
|
|
35
|
+
return decodeURIComponent(part);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new KetError({
|
|
39
|
+
code: 'E_ROUTE_ENCODING',
|
|
40
|
+
message: `route path "${path}" contains invalid percent encoding`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/** True when both patterns can match one pathname and neither is more specific. */
|
|
45
|
+
export function ambiguousRoutes(a, b) {
|
|
46
|
+
if (a.segments.length !== b.segments.length || a.staticCount !== b.staticCount)
|
|
47
|
+
return false;
|
|
48
|
+
return a.segments.every((segment, i) => {
|
|
49
|
+
const other = b.segments[i];
|
|
50
|
+
return segment.kind === 'param' || other.kind === 'param' || segment.value === other.value;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function matchRoutePattern(pattern, pathname) {
|
|
54
|
+
const raw = pathname === '/' ? [] : pathname.slice(1).split('/');
|
|
55
|
+
if (raw.length !== pattern.segments.length)
|
|
56
|
+
return null;
|
|
57
|
+
const params = {};
|
|
58
|
+
for (let i = 0; i < pattern.segments.length; i += 1) {
|
|
59
|
+
const segment = pattern.segments[i];
|
|
60
|
+
const value = decode(raw[i], pathname);
|
|
61
|
+
if (segment.kind === 'static') {
|
|
62
|
+
if (segment.value !== value)
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
params[segment.name] = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return params;
|
|
70
|
+
}
|
|
71
|
+
export function compileRoutes(routes) {
|
|
72
|
+
const entries = Object.entries(routes).map(([path, value]) => ({ pattern: parseRoutePattern(path), value }));
|
|
73
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
74
|
+
for (let j = i + 1; j < entries.length; j += 1) {
|
|
75
|
+
const a = entries[i].pattern;
|
|
76
|
+
const b = entries[j].pattern;
|
|
77
|
+
if (ambiguousRoutes(a, b)) {
|
|
78
|
+
throw new KetError({
|
|
79
|
+
code: 'E_ROUTE_AMBIGUOUS',
|
|
80
|
+
message: `routes "${a.path}" and "${b.path}" can match the same path with equal priority`,
|
|
81
|
+
hint: 'make one route more specific, or let one handler own both paths',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
entries.sort((a, b) => b.pattern.staticCount - a.pattern.staticCount ||
|
|
87
|
+
b.pattern.segments.length - a.pattern.segments.length ||
|
|
88
|
+
a.pattern.path.localeCompare(b.pattern.path));
|
|
89
|
+
return (pathname) => {
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const params = matchRoutePattern(entry.pattern, pathname);
|
|
92
|
+
if (params)
|
|
93
|
+
return { path: entry.pattern.path, value: entry.value, params };
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAYtC,MAAM,KAAK,GAAG,gCAAgC,CAAA;AAE9C,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,IAAI,uBAAuB,EAAE,CAAC,CAAA;IAC9F,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAW,EAAE;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;YAC/B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,QAAQ,CAAC;oBACjB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,UAAU,IAAI,yBAAyB,IAAI,kBAAkB;iBACvE,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,UAAU,IAAI,qCAAqC,IAAI,GAAG;gBACnE,IAAI,EAAE,4EAA4E;aACnF,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAA;IACtD,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5F,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE;IACpD,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,eAAe,IAAI,qCAAqC;SAClE,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,CAAe,EAAE,CAAe;IAC9D,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IAC5F,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAY,CAAA;QACtC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAA;IAC5F,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAqB,EAAE,QAAgB;IACvE,MAAM,GAAG,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACvD,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAY,CAAA;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,QAAQ,CAAC,CAAA;QAChD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,MAAyB;IAKxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;YAC7B,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,QAAQ,CAAC;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,+CAA+C;oBACzF,IAAI,EAAE,iEAAiE;iBACxE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW;QAC7C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;QACrD,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAC/C,CAAA;IACD,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YACzD,IAAI,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;QAC7E,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ParsedType, TypeParse } from '../types.ts';
|
|
2
|
+
export declare const SCALARS: Set<string>;
|
|
3
|
+
/** A calendar date with no time or timezone, encoded canonically as YYYY-MM-DD. */
|
|
4
|
+
export declare function isDateText(value: unknown): value is string;
|
|
5
|
+
export declare function parseType(spec: string): TypeParse;
|
|
6
|
+
export declare const tsTypeOf: (t: ParsedType) => string;
|
|
7
|
+
export declare const sqlTypeOf: (t: ParsedType) => string;
|
|
8
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEnE,eAAO,MAAM,OAAO,aAAyF,CAAA;AAE7G,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAW1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAgBjD;AAgBD,eAAO,MAAM,QAAQ,MAAO,UAAU,KAAG,MAAoD,CAAA;AAgB7F,eAAO,MAAM,SAAS,MAAO,UAAU,KAAG,MAAqB,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export const SCALARS = new Set(['id', 'text', 'int', 'float', 'decimal', 'bool', 'json', 'date', 'datetime']);
|
|
2
|
+
/** A calendar date with no time or timezone, encoded canonically as YYYY-MM-DD. */
|
|
3
|
+
export function isDateText(value) {
|
|
4
|
+
if (typeof value !== 'string')
|
|
5
|
+
return false;
|
|
6
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
|
|
7
|
+
if (!match)
|
|
8
|
+
return false;
|
|
9
|
+
const year = Number(match[1]);
|
|
10
|
+
const month = Number(match[2]);
|
|
11
|
+
const day = Number(match[3]);
|
|
12
|
+
if (year === 0 || month < 1 || month > 12 || day < 1)
|
|
13
|
+
return false;
|
|
14
|
+
const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
15
|
+
const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
16
|
+
return day <= days[month - 1];
|
|
17
|
+
}
|
|
18
|
+
export function parseType(spec) {
|
|
19
|
+
if (typeof spec !== 'string')
|
|
20
|
+
return { ok: false, reason: 'type must be a string' };
|
|
21
|
+
let s = spec;
|
|
22
|
+
let optional = false;
|
|
23
|
+
if (s.endsWith('?')) {
|
|
24
|
+
optional = true;
|
|
25
|
+
s = s.slice(0, -1);
|
|
26
|
+
}
|
|
27
|
+
if (s.startsWith('ref:')) {
|
|
28
|
+
const target = s.slice(4);
|
|
29
|
+
if (!/^[a-z][a-z0-9_]*\.[A-Z][A-Za-z0-9]*$/.test(target))
|
|
30
|
+
return { ok: false, reason: `ref target must be "module.Model", got "${target}"` };
|
|
31
|
+
return { ok: true, base: 'ref', target, optional };
|
|
32
|
+
}
|
|
33
|
+
if (!SCALARS.has(s))
|
|
34
|
+
return { ok: false, reason: `unknown type "${spec}"` };
|
|
35
|
+
return { ok: true, base: s, optional };
|
|
36
|
+
}
|
|
37
|
+
// decimal is a number in TypeScript because it is a number in arithmetic; only
|
|
38
|
+
// its storage is exact.
|
|
39
|
+
const TS = {
|
|
40
|
+
id: 'string',
|
|
41
|
+
text: 'string',
|
|
42
|
+
int: 'number',
|
|
43
|
+
float: 'number',
|
|
44
|
+
decimal: 'number',
|
|
45
|
+
bool: 'boolean',
|
|
46
|
+
json: 'unknown',
|
|
47
|
+
date: 'string',
|
|
48
|
+
datetime: 'Date',
|
|
49
|
+
ref: 'string',
|
|
50
|
+
};
|
|
51
|
+
export const tsTypeOf = (t) => TS[t.base] + (t.optional ? ' | null' : '');
|
|
52
|
+
// SQLite has no exact decimal at all: NUMERIC affinity silently becomes REAL.
|
|
53
|
+
// TEXT is the only storage that gives it back unchanged.
|
|
54
|
+
const SQL = {
|
|
55
|
+
id: 'TEXT PRIMARY KEY',
|
|
56
|
+
text: 'TEXT',
|
|
57
|
+
int: 'INTEGER',
|
|
58
|
+
float: 'REAL',
|
|
59
|
+
decimal: 'TEXT',
|
|
60
|
+
bool: 'INTEGER',
|
|
61
|
+
json: 'TEXT',
|
|
62
|
+
date: 'TEXT',
|
|
63
|
+
datetime: 'TEXT',
|
|
64
|
+
ref: 'TEXT',
|
|
65
|
+
};
|
|
66
|
+
export const sqlTypeOf = (t) => SQL[t.base];
|
|
67
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Schema } from '../data/migrate.ts';
|
|
2
|
+
import type { KetModule, Manifest } from '../types.ts';
|
|
3
|
+
import type { ServeSpec } from '../server/boot.ts';
|
|
4
|
+
export type WorkerSpec = {
|
|
5
|
+
/** Local concurrency per queue. Several worker processes multiply it. */
|
|
6
|
+
queues: Record<string, number>;
|
|
7
|
+
pollMinMs?: number;
|
|
8
|
+
pollMaxMs?: number;
|
|
9
|
+
tenantRefreshMs?: number;
|
|
10
|
+
leaseMs?: number;
|
|
11
|
+
shutdownGraceMs?: number;
|
|
12
|
+
};
|
|
13
|
+
export type AppSpec = {
|
|
14
|
+
name: string;
|
|
15
|
+
modules: KetModule[];
|
|
16
|
+
theme?: KetModule;
|
|
17
|
+
/** Themes this deployment allows sites to select. `theme` remains the fallback. */
|
|
18
|
+
themes?: KetModule[];
|
|
19
|
+
datastore?: string;
|
|
20
|
+
requires?: string[];
|
|
21
|
+
/** An app that exposes functions but renders no pages: no theme, no region contract. */
|
|
22
|
+
headless?: boolean;
|
|
23
|
+
/** How the app runs: pages, routes, assets, datastore. Absent means it is never served. */
|
|
24
|
+
serve?: ServeSpec;
|
|
25
|
+
/** Same app and manifest, a separate production process role. */
|
|
26
|
+
worker?: WorkerSpec;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* What an authored workspace may name before module paths have been resolved.
|
|
30
|
+
*
|
|
31
|
+
* Keeping this separate from AppSpec is deliberate: composition, HTTP and workers
|
|
32
|
+
* continue to receive executable KetModule objects only. A string is allowed at
|
|
33
|
+
* the workspace boundary and nowhere deeper in the framework.
|
|
34
|
+
*/
|
|
35
|
+
export type ModuleRef = KetModule | string;
|
|
36
|
+
export type AppDeclaration = Omit<AppSpec, 'modules' | 'theme' | 'themes'> & {
|
|
37
|
+
modules: ModuleRef[];
|
|
38
|
+
theme?: ModuleRef;
|
|
39
|
+
themes?: ModuleRef[];
|
|
40
|
+
};
|
|
41
|
+
export type ModulePath = string | URL;
|
|
42
|
+
export type WorkspaceDeclaration = {
|
|
43
|
+
apps: AppDeclaration[];
|
|
44
|
+
/** Odoo-like roots whose direct children may contain ket.module.json. */
|
|
45
|
+
modulePaths?: ModulePath[];
|
|
46
|
+
};
|
|
47
|
+
export type Workspace = {
|
|
48
|
+
apps: Record<string, Manifest>;
|
|
49
|
+
datastores: Record<string, {
|
|
50
|
+
schema: Schema;
|
|
51
|
+
apps: string[];
|
|
52
|
+
modules: string[];
|
|
53
|
+
}>;
|
|
54
|
+
shared: string[];
|
|
55
|
+
soloed: Record<string, string[]>;
|
|
56
|
+
};
|
|
57
|
+
export declare function defineApp(spec: AppSpec): AppSpec;
|
|
58
|
+
export declare function defineApp(spec: AppDeclaration): AppDeclaration;
|
|
59
|
+
export declare function defineWorkspace<T extends WorkspaceDeclaration>(spec: T): T;
|
|
60
|
+
export declare function composeWorkspace(apps: AppSpec[]): Workspace;
|
|
61
|
+
export declare function explainWorkspace(ws: Workspace): string;
|
|
62
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/workspace.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,mFAAmF;IACnF,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;AAC1C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG;IAC3E,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,GAAG,CAAA;AACrC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,cAAc,EAAE,CAAA;IACtB,yEAAyE;IACzE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACjF,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACjC,CAAA;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;AACjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAAA;AAwB/D,wBAAgB,eAAe,CAAC,CAAC,SAAS,oBAAoB,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAM1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CA0F3D;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAiBtD"}
|