velocious 1.0.486 → 1.0.487

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.
@@ -0,0 +1,101 @@
1
+ // @ts-check
2
+ import restArgsError from "../utils/rest-args-error.js";
3
+ /**
4
+ * A Velocious package (engine): an external npm package that contributes data
5
+ * models, frontend-model resources and migrations to a consuming app. The app
6
+ * lists packages in `Configuration({packages: [...]})`; the framework then loads
7
+ * the package's `src/models`, discovers its `src/resources`, runs its
8
+ * `src/database/migrations`, and generates its frontend models into the app.
9
+ */
10
+ export default class VelociousPackage {
11
+ /**
12
+ * Wraps a plain descriptor as a VelociousPackage (or returns it unchanged when
13
+ * it already is one), so packages can be listed without importing this class.
14
+ * @param {VelociousPackage | import("../configuration-types.js").VelociousPackageDescriptor} descriptor - Package or plain descriptor.
15
+ * @returns {VelociousPackage} - The package instance.
16
+ */
17
+ static from(descriptor) {
18
+ if (descriptor instanceof VelociousPackage) {
19
+ return descriptor;
20
+ }
21
+ return new VelociousPackage(descriptor);
22
+ }
23
+ /**
24
+ * Derives the containing directory of a module url without Node's `path`/`url`
25
+ * modules, so this class stays safe to import in browser/Expo bundles.
26
+ * @param {string} url - A module url (usually `import.meta.url`).
27
+ * @returns {string} - The directory path that contains the module.
28
+ */
29
+ static _directoryFromUrl(url) {
30
+ const directoryUrl = new URL(".", url);
31
+ return decodeURIComponent(directoryUrl.pathname).replace(/\/$/, "");
32
+ }
33
+ /**
34
+ * Runs constructor.
35
+ * @param {import("../configuration-types.js").VelociousPackageDescriptor} args - Package descriptor.
36
+ */
37
+ constructor({ name, url, path, modelsPath, resourcesPath, migrationsPath, ...restArgs }) {
38
+ restArgsError(restArgs);
39
+ if (!name) {
40
+ throw new Error("A velocious package requires a name.");
41
+ }
42
+ if (!path && !url) {
43
+ throw new Error(`Velocious package "${name}" requires a "path" or a "url" (usually import.meta.url).`);
44
+ }
45
+ this._name = name;
46
+ this._path = path || VelociousPackage._directoryFromUrl(/** @type {string} */ (url));
47
+ this._modelsPath = modelsPath;
48
+ this._resourcesPath = resourcesPath;
49
+ this._migrationsPath = migrationsPath;
50
+ }
51
+ /**
52
+ * Runs get name.
53
+ * @returns {string} - The package name.
54
+ */
55
+ getName() {
56
+ return this._name;
57
+ }
58
+ /**
59
+ * Runs get path.
60
+ * @returns {string} - The package root directory (the one that contains `src`).
61
+ */
62
+ getPath() {
63
+ return this._path;
64
+ }
65
+ /**
66
+ * Runs get models path.
67
+ * @returns {string} - The package's models directory.
68
+ */
69
+ getModelsPath() {
70
+ return this._modelsPath || `${this._path}/src/models`;
71
+ }
72
+ /**
73
+ * Runs get resources path.
74
+ * @returns {string} - The package's frontend-model resources directory.
75
+ */
76
+ getResourcesPath() {
77
+ return this._resourcesPath || `${this._path}/src/resources`;
78
+ }
79
+ /**
80
+ * Runs get migrations path.
81
+ * @returns {string} - The package's migrations directory.
82
+ */
83
+ getMigrationsPath() {
84
+ return this._migrationsPath || `${this._path}/src/database/migrations`;
85
+ }
86
+ /**
87
+ * Derives the internal backend-project entry the framework appends so the
88
+ * existing resource-discovery + frontend-model generation machinery picks up
89
+ * this package. Generated frontend models are written to the app's output.
90
+ * @param {{frontendModelsOutputPath: string | undefined}} args - The app's frontend-models output path.
91
+ * @returns {import("../configuration-types.js").BackendProjectConfiguration} - The derived backend project.
92
+ */
93
+ toBackendProjectConfiguration({ frontendModelsOutputPath }) {
94
+ return {
95
+ frontendModelsOutputPath,
96
+ path: this.getPath(),
97
+ resourcesPath: this.getResourcesPath()
98
+ };
99
+ }
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVsb2Npb3VzLXBhY2thZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGFja2FnZXMvdmVsb2Npb3VzLXBhY2thZ2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWdCO0lBQ25DOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVO1FBQ3BCLElBQUksVUFBVSxZQUFZLGdCQUFnQixFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUE7UUFDbkIsQ0FBQztRQUVELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRztRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFdEMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ25GLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7UUFDekQsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLDJEQUEyRCxDQUFDLENBQUE7UUFDeEcsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNwRixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQTtRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLGFBQWEsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssZ0JBQWdCLENBQUE7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLDBCQUEwQixDQUFBO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw2QkFBNkIsQ0FBQyxFQUFDLHdCQUF3QixFQUFDO1FBQ3RELE9BQU87WUFDTCx3QkFBd0I7WUFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtTQUN2QyxDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIEEgVmVsb2Npb3VzIHBhY2thZ2UgKGVuZ2luZSk6IGFuIGV4dGVybmFsIG5wbSBwYWNrYWdlIHRoYXQgY29udHJpYnV0ZXMgZGF0YVxuICogbW9kZWxzLCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1pZ3JhdGlvbnMgdG8gYSBjb25zdW1pbmcgYXBwLiBUaGUgYXBwXG4gKiBsaXN0cyBwYWNrYWdlcyBpbiBgQ29uZmlndXJhdGlvbih7cGFja2FnZXM6IFsuLi5dfSlgOyB0aGUgZnJhbWV3b3JrIHRoZW4gbG9hZHNcbiAqIHRoZSBwYWNrYWdlJ3MgYHNyYy9tb2RlbHNgLCBkaXNjb3ZlcnMgaXRzIGBzcmMvcmVzb3VyY2VzYCwgcnVucyBpdHNcbiAqIGBzcmMvZGF0YWJhc2UvbWlncmF0aW9uc2AsIGFuZCBnZW5lcmF0ZXMgaXRzIGZyb250ZW5kIG1vZGVscyBpbnRvIHRoZSBhcHAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1BhY2thZ2Uge1xuICAvKipcbiAgICogV3JhcHMgYSBwbGFpbiBkZXNjcmlwdG9yIGFzIGEgVmVsb2Npb3VzUGFja2FnZSAob3IgcmV0dXJucyBpdCB1bmNoYW5nZWQgd2hlblxuICAgKiBpdCBhbHJlYWR5IGlzIG9uZSksIHNvIHBhY2thZ2VzIGNhbiBiZSBsaXN0ZWQgd2l0aG91dCBpbXBvcnRpbmcgdGhpcyBjbGFzcy5cbiAgICogQHBhcmFtIHtWZWxvY2lvdXNQYWNrYWdlIHwgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNQYWNrYWdlRGVzY3JpcHRvcn0gZGVzY3JpcHRvciAtIFBhY2thZ2Ugb3IgcGxhaW4gZGVzY3JpcHRvci5cbiAgICogQHJldHVybnMge1ZlbG9jaW91c1BhY2thZ2V9IC0gVGhlIHBhY2thZ2UgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZnJvbShkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNQYWNrYWdlKSB7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgVmVsb2Npb3VzUGFja2FnZShkZXNjcmlwdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5IG9mIGEgbW9kdWxlIHVybCB3aXRob3V0IE5vZGUncyBgcGF0aGAvYHVybGBcbiAgICogbW9kdWxlcywgc28gdGhpcyBjbGFzcyBzdGF5cyBzYWZlIHRvIGltcG9ydCBpbiBicm93c2VyL0V4cG8gYnVuZGxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIEEgbW9kdWxlIHVybCAodXN1YWxseSBgaW1wb3J0Lm1ldGEudXJsYCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZS5cbiAgICovXG4gIHN0YXRpYyBfZGlyZWN0b3J5RnJvbVVybCh1cmwpIHtcbiAgICBjb25zdCBkaXJlY3RvcnlVcmwgPSBuZXcgVVJMKFwiLlwiLCB1cmwpXG5cbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGRpcmVjdG9yeVVybC5wYXRobmFtZSkucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlZlbG9jaW91c1BhY2thZ2VEZXNjcmlwdG9yfSBhcmdzIC0gUGFja2FnZSBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe25hbWUsIHVybCwgcGF0aCwgbW9kZWxzUGF0aCwgcmVzb3VyY2VzUGF0aCwgbWlncmF0aW9uc1BhdGgsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmVsb2Npb3VzIHBhY2thZ2UgcmVxdWlyZXMgYSBuYW1lLlwiKVxuICAgIH1cblxuICAgIGlmICghcGF0aCAmJiAhdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZlbG9jaW91cyBwYWNrYWdlIFwiJHtuYW1lfVwiIHJlcXVpcmVzIGEgXCJwYXRoXCIgb3IgYSBcInVybFwiICh1c3VhbGx5IGltcG9ydC5tZXRhLnVybCkuYClcbiAgICB9XG5cbiAgICB0aGlzLl9uYW1lID0gbmFtZVxuICAgIHRoaXMuX3BhdGggPSBwYXRoIHx8IFZlbG9jaW91c1BhY2thZ2UuX2RpcmVjdG9yeUZyb21VcmwoLyoqIEB0eXBlIHtzdHJpbmd9ICovICh1cmwpKVxuICAgIHRoaXMuX21vZGVsc1BhdGggPSBtb2RlbHNQYXRoXG4gICAgdGhpcy5fcmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGhcbiAgICB0aGlzLl9taWdyYXRpb25zUGF0aCA9IG1pZ3JhdGlvbnNQYXRoXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcGFja2FnZSBuYW1lLlxuICAgKi9cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2Ugcm9vdCBkaXJlY3RvcnkgKHRoZSBvbmUgdGhhdCBjb250YWlucyBgc3JjYCkuXG4gICAqL1xuICBnZXRQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXRoXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbW9kZWxzIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2UncyBtb2RlbHMgZGlyZWN0b3J5LlxuICAgKi9cbiAgZ2V0TW9kZWxzUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxzUGF0aCB8fCBgJHt0aGlzLl9wYXRofS9zcmMvbW9kZWxzYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHJlc291cmNlcyBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWNrYWdlJ3MgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldFJlc291cmNlc1BhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlc1BhdGggfHwgYCR7dGhpcy5fcGF0aH0vc3JjL3Jlc291cmNlc2BcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBtaWdyYXRpb25zIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2UncyBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldE1pZ3JhdGlvbnNQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9taWdyYXRpb25zUGF0aCB8fCBgJHt0aGlzLl9wYXRofS9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2BcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIHRoZSBpbnRlcm5hbCBiYWNrZW5kLXByb2plY3QgZW50cnkgdGhlIGZyYW1ld29yayBhcHBlbmRzIHNvIHRoZVxuICAgKiBleGlzdGluZyByZXNvdXJjZS1kaXNjb3ZlcnkgKyBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uIG1hY2hpbmVyeSBwaWNrcyB1cFxuICAgKiB0aGlzIHBhY2thZ2UuIEdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGFwcCdzIG91dHB1dC5cbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWR9fSBhcmdzIC0gVGhlIGFwcCdzIGZyb250ZW5kLW1vZGVscyBvdXRwdXQgcGF0aC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9ufSAtIFRoZSBkZXJpdmVkIGJhY2tlbmQgcHJvamVjdC5cbiAgICovXG4gIHRvQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uKHtmcm9udGVuZE1vZGVsc091dHB1dFBhdGh9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb250ZW5kTW9kZWxzT3V0cHV0UGF0aCxcbiAgICAgIHBhdGg6IHRoaXMuZ2V0UGF0aCgpLFxuICAgICAgcmVzb3VyY2VzUGF0aDogdGhpcy5nZXRSZXNvdXJjZXNQYXRoKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/server-change-feed.js","../src/sync/sync-envelope-replay-service.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/server-change-feed.js","../src/sync/sync-envelope-replay-service.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.486",
6
+ "version": "1.0.487",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -417,11 +417,28 @@
417
417
 
418
418
  /**
419
419
  * @typedef {object} BackendProjectConfiguration
420
- * @property {string} path - Path to the backend project.
420
+ * @property {string} path - Path to the backend project. May be an app root or a contributing package root (package entries are appended internally from `packages`).
421
421
  * @property {string} [frontendModelsOutputPath] - Optional output project path where `src/frontend-models` should be generated.
422
+ * @property {string} [resourcesPath] - Optional override for the resources directory to auto-discover; defaults to `<path>/src/resources`. Set internally for package entries.
422
423
  * @property {Record<string, FrontendModelResourceDefinition>} [frontendModels] - Auto-discovered frontend model definitions keyed by model class name. Set internally by the environment handler — do not set manually.
423
424
  */
424
425
 
426
+ /**
427
+ * A descriptor for an external Velocious package (engine) that contributes models,
428
+ * resources and migrations. A package usually exports `new VelociousPackage({name, url: import.meta.url})`.
429
+ * @typedef {object} VelociousPackageDescriptor
430
+ * @property {string} name - The package name.
431
+ * @property {string} [url] - The descriptor module's `import.meta.url`; the package root is derived from it when `path` is omitted.
432
+ * @property {string} [path] - The package root directory (the one containing `src`). Derived from `url` when omitted.
433
+ * @property {string} [modelsPath] - Override for the package's models directory (default `<path>/src/models`).
434
+ * @property {string} [resourcesPath] - Override for the package's frontend-model resources directory (default `<path>/src/resources`).
435
+ * @property {string} [migrationsPath] - Override for the package's migrations directory (default `<path>/src/database/migrations`).
436
+ */
437
+
438
+ /**
439
+ * @typedef {import("./packages/velocious-package.js").default | VelociousPackageDescriptor} VelociousPackageConfiguration
440
+ */
441
+
425
442
  /**
426
443
  * @typedef {object} RouteResolverHookArgs
427
444
  * @property {import("./configuration.js").default} configuration - Configuration instance.
@@ -491,6 +508,7 @@
491
508
  * @property {AbilityResolverType} [abilityResolver] - Resolver for creating request-scoped ability instances.
492
509
  * @property {AttachmentsConfiguration} [attachments] - Attachment storage configuration.
493
510
  * @property {BackendProjectConfiguration[]} [backendProjects] - Backend project definitions used for frontend model generation.
511
+ * @property {VelociousPackageConfiguration[]} [packages] - External Velocious packages that contribute models, frontend-model resources and migrations.
494
512
  * @property {{[key: string]: {[key: string]: DatabaseConfigurationType}}} database - Database configurations keyed by environment and identifier.
495
513
  * @property {boolean} [debug] - Enable debug logging.
496
514
  * @property {boolean | DebugEndpointConfiguration} [debugEndpoint] - Enable the built-in debug endpoint. Defaults to false.
@@ -25,6 +25,7 @@ import PluginRoutes from "./routes/plugin-routes.js"
25
25
  import restArgsError from "./utils/rest-args-error.js"
26
26
  import {validateTimeZone} from "./time-zone.js"
27
27
  import {withTrackedStack} from "./utils/with-tracked-stack.js"
28
+ import VelociousPackage from "./packages/velocious-package.js"
28
29
 
29
30
  export {CurrentConfigurationNotSetError}
30
31
 
@@ -127,7 +128,7 @@ export default class VelociousConfiguration {
127
128
  * Runs constructor.
128
129
  * @param {import("./configuration-types.js").ConfigurationArgsType} args - Configuration arguments.
129
130
  */
130
- constructor({abilityResolver, abilityResources, attachments, autoload = true, backgroundJobs, backendProjects, beacon, cookieSecret, cors, database, debug = false, debugEndpoint = false, directory, enforceTenantDatabaseScopes = true, environment, environmentHandler, exposeInternalErrorsToClients = false, httpServer, initializeModels, initializers, locale, localeFallbacks, locales, logging, mailerBackend, requestTimeoutMs, routeResolverHooks, scheduledBackgroundJobs, structureSql, sync, tenantDatabaseProviders, tenantDatabaseResolver, tenantResolver, testing, timeZone, timezoneOffsetMinutes, trustedProxies, websocketChannelResolver, websocketMessageHandlerResolver, ...restArgs}) {
131
+ constructor({abilityResolver, abilityResources, attachments, autoload = true, backgroundJobs, backendProjects, beacon, cookieSecret, cors, database, debug = false, debugEndpoint = false, directory, enforceTenantDatabaseScopes = true, environment, environmentHandler, exposeInternalErrorsToClients = false, httpServer, initializeModels, initializers, locale, localeFallbacks, locales, logging, mailerBackend, packages, requestTimeoutMs, routeResolverHooks, scheduledBackgroundJobs, structureSql, sync, tenantDatabaseProviders, tenantDatabaseResolver, tenantResolver, testing, timeZone, timezoneOffsetMinutes, trustedProxies, websocketChannelResolver, websocketMessageHandlerResolver, ...restArgs}) {
131
132
  restArgsError(restArgs)
132
133
 
133
134
  this._abilityResolver = abilityResolver
@@ -160,7 +161,9 @@ export default class VelociousConfiguration {
160
161
  this._beaconLastDownError = undefined
161
162
  this._scheduledBackgroundJobs = scheduledBackgroundJobs
162
163
  this._attachments = attachments || {}
163
- this._backendProjects = backendProjects || []
164
+ // Copy so appending package-derived entries below never mutates a caller's
165
+ // shared array (config modules commonly export a reused backendProjects array).
166
+ this._backendProjects = backendProjects ? [...backendProjects] : []
164
167
  /** @type {import("./configuration-types.js").ClientErrorPayloadReporterType[]} */
165
168
  this._clientErrorPayloadReporters = []
166
169
  this.cors = cors
@@ -174,6 +177,18 @@ export default class VelociousConfiguration {
174
177
  this._exposeInternalErrorsToClients = exposeInternalErrorsToClients
175
178
  this._directory = directory
176
179
  this._initializeModels = initializeModels
180
+ /** @type {VelociousPackage[]} */
181
+ this._packages = (packages || []).map((entry) => VelociousPackage.from(entry))
182
+
183
+ // Append a derived backend-project per package so the existing resource
184
+ // discovery + frontend-model generation machinery includes it. Package
185
+ // frontend models are generated into the app's frontend-models output.
186
+ const appFrontendModelsOutputPath = this._backendProjects[0]?.frontendModelsOutputPath
187
+
188
+ for (const velociousPackage of this._packages) {
189
+ this._backendProjects.push(velociousPackage.toBackendProjectConfiguration({frontendModelsOutputPath: appFrontendModelsOutputPath}))
190
+ }
191
+
177
192
  this._isInitialized = false
178
193
  this.httpServer = httpServer || {}
179
194
  /**
@@ -841,6 +856,12 @@ export default class VelociousConfiguration {
841
856
  */
842
857
  getBackendProjects() { return this._backendProjects }
843
858
 
859
+ /**
860
+ * Runs get packages.
861
+ * @returns {VelociousPackage[]} - Registered Velocious packages.
862
+ */
863
+ getPackages() { return this._packages }
864
+
844
865
  /**
845
866
  * Runs get ability resources.
846
867
  * @returns {import("./configuration-types.js").AbilityResourceClassType[]} - Ability resource classes.
@@ -1671,6 +1692,8 @@ export default class VelociousConfiguration {
1671
1692
  await this._initializeModels({configuration: this, type: args.type})
1672
1693
  }
1673
1694
 
1695
+ await this.getEnvironmentHandler().initializePackageModels(this)
1696
+
1674
1697
  await this.getEnvironmentHandler().initializeFrontendModelWebsocketPublishers(this)
1675
1698
  }
1676
1699
  }
@@ -614,4 +614,13 @@ export default class VelociousEnvironmentHandlerBase {
614
614
  async initializeFrontendModelWebsocketPublishers(_configuration) {
615
615
  // No-op in base handler; Node handler does the real registration.
616
616
  }
617
+
618
+ /**
619
+ * Loads models contributed by registered packages.
620
+ * @param {import("../configuration.js").default} _configuration - Configuration instance.
621
+ * @returns {Promise<void>} - Resolves when complete.
622
+ */
623
+ async initializePackageModels(_configuration) {
624
+ // No-op in base handler; Node handler loads package models from the filesystem.
625
+ }
617
626
  }
@@ -31,6 +31,8 @@ import * as inflection from "inflection"
31
31
  import path from "path"
32
32
  import {AsyncLocalStorage as NodeAsyncLocalStorage} from "node:async_hooks"
33
33
  import {timingSafeEqual} from "node:crypto"
34
+ import requireContext from "require-context"
35
+ import InitializerFromRequireContext from "../database/initializer-from-require-context.js"
34
36
  import toImportSpecifier from "../utils/to-import-specifier.js"
35
37
  import {validateTimeZone} from "../time-zone.js"
36
38
 
@@ -103,7 +105,7 @@ export default class VelociousEnvironmentHandlerNode extends Base{
103
105
  for (const backendProject of backendProjects) {
104
106
  if (backendProject.frontendModels) continue
105
107
 
106
- const resourcesDir = path.join(backendProject.path, "src", "resources")
108
+ const resourcesDir = backendProject.resourcesPath || path.join(backendProject.path, "src", "resources")
107
109
  let files
108
110
 
109
111
  try {
@@ -145,6 +147,43 @@ export default class VelociousEnvironmentHandlerNode extends Base{
145
147
  }
146
148
  }
147
149
 
150
+ /**
151
+ * Loads models contributed by registered packages into the model registry,
152
+ * after the app's own `initializeModels` hook. A package whose models directory
153
+ * is absent is skipped; a package model whose name collides with an
154
+ * already-registered different class throws. Node-only (uses the filesystem), so
155
+ * it lives here rather than in the browser-bundled Configuration.
156
+ * @param {import("../configuration.js").default} configuration - Configuration instance.
157
+ * @returns {Promise<void>} - Resolves when complete.
158
+ */
159
+ async initializePackageModels(configuration) {
160
+ for (const velociousPackage of configuration.getPackages()) {
161
+ const modelsPath = velociousPackage.getModelsPath()
162
+
163
+ try {
164
+ await fs.access(modelsPath)
165
+ } catch {
166
+ continue
167
+ }
168
+
169
+ const packageRequireContext = /** @type {import("../database/initializer-from-require-context.js").ModelClassRequireContextType} */ (requireContext(modelsPath, true, /^(.+)\.js$/))
170
+ const modelClasses = configuration.getModelClasses()
171
+
172
+ for (const fileName of packageRequireContext.keys()) {
173
+ const modelClass = packageRequireContext(fileName)?.default
174
+ const existing = modelClass && modelClasses[modelClass.getModelName()]
175
+
176
+ if (existing && existing !== modelClass) {
177
+ throw new Error(`Package "${velociousPackage.getName()}" model "${modelClass.getModelName()}" collides with an already-registered model.`)
178
+ }
179
+ }
180
+
181
+ await configuration.ensureConnections({name: `Initialize ${velociousPackage.getName()} package models`}, async () => {
182
+ await new InitializerFromRequireContext({requireContext: packageRequireContext}).initialize({configuration})
183
+ })
184
+ }
185
+ }
186
+
148
187
  /**
149
188
  * Runs set configuration.
150
189
  * @param {import("../configuration.js").default} newConfiguration - New configuration.
@@ -761,32 +800,79 @@ export default class VelociousEnvironmentHandlerNode extends Base{
761
800
  * @returns {Promise<Array<import("./base.js").MigrationObjectType>>} - Resolves with the migrations.
762
801
  */
763
802
  async findMigrations() {
764
- const migrationsPath = `${this.getConfiguration().getDirectory()}/src/database/migrations`
765
- const glob = await fs.glob(`${migrationsPath}/**/*.js`)
766
- let files = []
803
+ const configuration = this.getConfiguration()
804
+ const migrationDirectories = [`${configuration.getDirectory()}/src/database/migrations`]
805
+
806
+ for (const velociousPackage of configuration.getPackages()) {
807
+ migrationDirectories.push(velociousPackage.getMigrationsPath())
808
+ }
767
809
 
768
- for await (const fullPath of glob) {
769
- const file = await path.basename(fullPath)
810
+ /** @type {Array<import("./base.js").MigrationObjectType>} */
811
+ const files = []
770
812
 
771
- const match = file.match(/^(\d{14})-(.+)\.js$/)
813
+ for (const migrationsPath of migrationDirectories) {
814
+ await this._collectMigrationsFromDirectory(migrationsPath, files)
815
+ }
772
816
 
773
- if (!match) continue
817
+ this._ensureNoMigrationTimestampCollisions(files)
774
818
 
775
- const date = parseInt(match[1])
776
- const migrationName = match[2]
777
- const migrationClassName = inflection.camelize(migrationName.replaceAll("-", "_"))
819
+ return files.sort((migration1, migration2) => migration1.date - migration2.date)
820
+ }
778
821
 
779
- files.push({
780
- file,
781
- fullPath: `${migrationsPath}/${file}`,
782
- date,
783
- migrationClassName
784
- })
822
+ /**
823
+ * Collects migration files from one directory into `files`, preserving each
824
+ * file's real absolute path (so app and package migrations keep their own
825
+ * source location). A missing directory is skipped.
826
+ * @param {string} migrationsPath - Directory to scan.
827
+ * @param {Array<import("./base.js").MigrationObjectType>} files - Accumulator to push into.
828
+ * @returns {Promise<void>} - Resolves when complete.
829
+ */
830
+ async _collectMigrationsFromDirectory(migrationsPath, files) {
831
+ const glob = await fs.glob(`${migrationsPath}/**/*.js`)
832
+
833
+ try {
834
+ for await (const fullPath of glob) {
835
+ const file = await path.basename(fullPath)
836
+ const match = file.match(/^(\d{14})-(.+)\.js$/)
837
+
838
+ if (!match) continue
839
+
840
+ const date = parseInt(match[1])
841
+ const migrationName = match[2]
842
+ const migrationClassName = inflection.camelize(migrationName.replaceAll("-", "_"))
843
+
844
+ files.push({file, fullPath, date, migrationClassName})
845
+ }
846
+ } catch (error) {
847
+ if (/** @type {NodeJS.ErrnoException} */ (error)?.code !== "ENOENT") {
848
+ throw error
849
+ }
785
850
  }
851
+ }
786
852
 
787
- files = files.sort((migration1, migration2) => migration1.date - migration2.date)
853
+ /**
854
+ * Throws if two migrations from different files share the same 14-digit
855
+ * timestamp. The `schema_migrations` ledger keys on the timestamp, so a silent
856
+ * collision (e.g. between the app and a package, or two packages) would leave
857
+ * the second migration un-run — a data bug. Fail loudly instead.
858
+ * @param {Array<import("./base.js").MigrationObjectType>} files - Collected migrations.
859
+ * @returns {void} - No return value.
860
+ */
861
+ _ensureNoMigrationTimestampCollisions(files) {
862
+ /** @type {Map<number, string>} */
863
+ const pathsByDate = new Map()
788
864
 
789
- return files
865
+ for (const migration of files) {
866
+ if (!migration.fullPath) continue
867
+
868
+ const existing = pathsByDate.get(migration.date)
869
+
870
+ if (existing && existing !== migration.fullPath) {
871
+ throw new Error(`Two migrations share the timestamp ${migration.date}: ${existing} and ${migration.fullPath}. Migration timestamps must be unique across the app and all packages.`)
872
+ }
873
+
874
+ pathsByDate.set(migration.date, migration.fullPath)
875
+ }
790
876
  }
791
877
 
792
878
  /**