@beignet/core 0.0.24 → 0.0.25
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/CHANGELOG.md +7 -0
- package/README.md +6 -2
- package/dist/client-only.d.ts +2 -0
- package/dist/client-only.d.ts.map +1 -1
- package/dist/client-only.js +2 -0
- package/dist/client-only.js.map +1 -1
- package/dist/providers/metadata.d.ts +2 -0
- package/dist/providers/metadata.d.ts.map +1 -1
- package/dist/providers/metadata.js +12 -0
- package/dist/providers/metadata.js.map +1 -1
- package/dist/server-only.d.ts +2 -0
- package/dist/server-only.d.ts.map +1 -1
- package/dist/server-only.js +2 -0
- package/dist/server-only.js.map +1 -1
- package/package.json +1 -1
- package/skills/app-architecture/SKILL.md +29 -2
- package/src/providers/metadata.ts +23 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @beignet/core
|
|
2
2
|
|
|
3
|
+
## 0.0.25
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1f84b39: Add provider table metadata diagnostics, Drizzle operational schema exports, and `beignet db schema generate` for app-owned migration flows.
|
|
8
|
+
- 7c83da7: Refresh package-shipped TanStack Intent skills to match current Beignet app structure, generators, route helpers, and React Query cache helpers.
|
|
9
|
+
|
|
3
10
|
## 0.0.24
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -35,7 +35,8 @@ This package requires TypeScript 5.0 or higher for proper type inference.
|
|
|
35
35
|
This package ships a TanStack Intent skill for coding agents:
|
|
36
36
|
`@beignet/core#app-architecture`. Load it when adding or fixing Beignet
|
|
37
37
|
schemas, contracts, use cases, app errors, ports, policies, app context,
|
|
38
|
-
providers, workflow primitives, or core subpath
|
|
38
|
+
providers, domain events, workflow primitives, seeds, tests, or core subpath
|
|
39
|
+
imports.
|
|
39
40
|
|
|
40
41
|
## Subpaths
|
|
41
42
|
|
|
@@ -404,6 +405,7 @@ without importing provider implementation code.
|
|
|
404
405
|
"appPorts": [{ "name": "cache", "type": "CachePort" }],
|
|
405
406
|
"env": ["CACHE_URL", "CACHE_REGION"],
|
|
406
407
|
"requiredEnv": ["CACHE_URL"],
|
|
408
|
+
"requiredTables": ["cache_entries"],
|
|
407
409
|
"registration": {
|
|
408
410
|
"required": true,
|
|
409
411
|
"tokens": ["cacheProvider", "createCacheProvider"]
|
|
@@ -415,7 +417,9 @@ without importing provider implementation code.
|
|
|
415
417
|
```
|
|
416
418
|
|
|
417
419
|
`env` lists all variables the provider may read. `requiredEnv` is the subset
|
|
418
|
-
that `beignet doctor --strict` should require in app config.
|
|
420
|
+
that `beignet doctor --strict` should require in app config. `requiredTables`
|
|
421
|
+
lists database tables the provider always needs when it is installed and used;
|
|
422
|
+
doctor checks app schema, migrations, and database setup files for those names.
|
|
419
423
|
|
|
420
424
|
`registration.required: true` marks providers that apps must register in
|
|
421
425
|
`server/providers.ts`; doctor reports a missing registration as a warning,
|
package/dist/client-only.d.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Host frameworks may provide their own runtime-only enforcement. This marker
|
|
5
5
|
* is intentionally a no-op so Beignet can enforce intent through `beignet lint`.
|
|
6
|
+
* Import it for side effects at the top of client-only modules:
|
|
7
|
+
* `import "@beignet/core/client-only";`.
|
|
6
8
|
*/
|
|
7
9
|
export declare const beignetClientOnly = true;
|
|
8
10
|
//# sourceMappingURL=client-only.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-only.d.ts","sourceRoot":"","sources":["../src/client-only.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client-only.d.ts","sourceRoot":"","sources":["../src/client-only.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC"}
|
package/dist/client-only.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Host frameworks may provide their own runtime-only enforcement. This marker
|
|
5
5
|
* is intentionally a no-op so Beignet can enforce intent through `beignet lint`.
|
|
6
|
+
* Import it for side effects at the top of client-only modules:
|
|
7
|
+
* `import "@beignet/core/client-only";`.
|
|
6
8
|
*/
|
|
7
9
|
export const beignetClientOnly = true;
|
|
8
10
|
//# sourceMappingURL=client-only.js.map
|
package/dist/client-only.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-only.js","sourceRoot":"","sources":["../src/client-only.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client-only.js","sourceRoot":"","sources":["../src/client-only.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC"}
|
|
@@ -20,6 +20,7 @@ export type ProviderPackageVariantMetadata = {
|
|
|
20
20
|
displayName?: string;
|
|
21
21
|
env?: readonly string[];
|
|
22
22
|
requiredEnv?: readonly string[];
|
|
23
|
+
requiredTables?: readonly string[];
|
|
23
24
|
registration?: ProviderPackageRegistrationMetadata;
|
|
24
25
|
};
|
|
25
26
|
export type ProviderPackageMetadata = {
|
|
@@ -28,6 +29,7 @@ export type ProviderPackageMetadata = {
|
|
|
28
29
|
appPorts?: readonly ProviderPackagePortMetadata[];
|
|
29
30
|
env?: readonly string[];
|
|
30
31
|
requiredEnv?: readonly string[];
|
|
32
|
+
requiredTables?: readonly string[];
|
|
31
33
|
registration?: ProviderPackageRegistrationMetadata;
|
|
32
34
|
variants?: readonly ProviderPackageVariantMetadata[];
|
|
33
35
|
watchers?: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/providers/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,SAAS,GAAG,MAAM,CAAC;AAErE,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,mCAAmC,CAAC;IAC/C,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,mCAAmC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAClD,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,mCAAmC,CAAC;IACnD,QAAQ,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACrD,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAC1C;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,uBAAuB,CAAA;CAAE,GACpD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,4BAA4B,EAAE,CAAA;CAAE,CAAC;AAExE,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,kCAAkC,
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/providers/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,SAAS,GAAG,MAAM,CAAC;AAErE,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,mCAAmC,CAAC;IAC/C,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,mCAAmC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAClD,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,mCAAmC,CAAC;IACnD,QAAQ,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACrD,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAC1C;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,uBAAuB,CAAA;CAAE,GACpD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,4BAA4B,EAAE,CAAA;CAAE,CAAC;AAExE,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,kCAAkC,CA2GpC"}
|
|
@@ -49,6 +49,9 @@ export function parseProviderPackageMetadata(input) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
+
const requiredTables = parseStringArray(input.requiredTables, "beignet.provider.requiredTables", issues);
|
|
53
|
+
if (requiredTables !== undefined)
|
|
54
|
+
metadata.requiredTables = requiredTables;
|
|
52
55
|
const watchers = parseStringArray(input.watchers, "beignet.provider.watchers", issues);
|
|
53
56
|
if (watchers !== undefined)
|
|
54
57
|
metadata.watchers = watchers;
|
|
@@ -74,6 +77,12 @@ export function parseProviderPackageMetadata(input) {
|
|
|
74
77
|
message: "must not be set when beignet.provider.variants is present; declare registration on each variant instead",
|
|
75
78
|
});
|
|
76
79
|
}
|
|
80
|
+
if (input.requiredTables !== undefined) {
|
|
81
|
+
issues.push({
|
|
82
|
+
path: "beignet.provider.requiredTables",
|
|
83
|
+
message: "must not be set when beignet.provider.variants is present; declare requiredTables on each variant instead",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
77
86
|
}
|
|
78
87
|
if (issues.length > 0) {
|
|
79
88
|
return { success: false, issues };
|
|
@@ -192,6 +201,7 @@ function parseVariants(value, issues) {
|
|
|
192
201
|
}
|
|
193
202
|
}
|
|
194
203
|
}
|
|
204
|
+
const requiredTables = parseStringArray(entry.requiredTables, `${entryPath}.requiredTables`, issues);
|
|
195
205
|
const registration = parseRegistration(entry.registration, issues, `${entryPath}.registration`);
|
|
196
206
|
if (name === undefined)
|
|
197
207
|
continue;
|
|
@@ -202,6 +212,8 @@ function parseVariants(value, issues) {
|
|
|
202
212
|
variant.env = env;
|
|
203
213
|
if (requiredEnv !== undefined)
|
|
204
214
|
variant.requiredEnv = requiredEnv;
|
|
215
|
+
if (requiredTables !== undefined)
|
|
216
|
+
variant.requiredTables = requiredTables;
|
|
205
217
|
if (registration !== undefined)
|
|
206
218
|
variant.registration = registration;
|
|
207
219
|
parsed.push(variant);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/providers/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/providers/metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/server-only.d.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Host frameworks may provide their own runtime-only enforcement. This marker
|
|
5
5
|
* is intentionally a no-op so Beignet can enforce intent through `beignet lint`.
|
|
6
|
+
* Import it for side effects at the top of server-only modules:
|
|
7
|
+
* `import "@beignet/core/server-only";`.
|
|
6
8
|
*/
|
|
7
9
|
export declare const beignetServerOnly = true;
|
|
8
10
|
//# sourceMappingURL=server-only.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-only.d.ts","sourceRoot":"","sources":["../src/server-only.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server-only.d.ts","sourceRoot":"","sources":["../src/server-only.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC"}
|
package/dist/server-only.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Host frameworks may provide their own runtime-only enforcement. This marker
|
|
5
5
|
* is intentionally a no-op so Beignet can enforce intent through `beignet lint`.
|
|
6
|
+
* Import it for side effects at the top of server-only modules:
|
|
7
|
+
* `import "@beignet/core/server-only";`.
|
|
6
8
|
*/
|
|
7
9
|
export const beignetServerOnly = true;
|
|
8
10
|
//# sourceMappingURL=server-only.js.map
|
package/dist/server-only.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-only.js","sourceRoot":"","sources":["../src/server-only.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server-only.js","sourceRoot":"","sources":["../src/server-only.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: app-architecture
|
|
3
|
-
description: "Build Beignet app feature slices with @beignet/core primitives: schemas, contracts, use cases, app errors, ports, policies, context, providers, jobs, schedules, tasks, outbox, mail, uploads, and
|
|
3
|
+
description: "Build Beignet app feature slices with @beignet/core primitives: schemas, contracts, use cases, app errors, ports, policies, context, providers, domain events, listeners, jobs, schedules, tasks, notifications, outbox, mail, uploads, seeds, tests, and explicit core subpath imports. Use when adding or fixing Beignet application behavior, dependency boundaries, app-facing ports, authorization, workflow primitives, or app-bound lib builders."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Beignet App Architecture
|
|
@@ -26,15 +26,25 @@ features/<feature>/
|
|
|
26
26
|
schemas.ts
|
|
27
27
|
routes.ts
|
|
28
28
|
use-cases/
|
|
29
|
+
domain/
|
|
29
30
|
ports.ts
|
|
30
31
|
policy.ts
|
|
31
32
|
client/
|
|
32
33
|
components/
|
|
34
|
+
jobs/
|
|
35
|
+
listeners/
|
|
36
|
+
notifications/
|
|
37
|
+
schedules/
|
|
38
|
+
tasks/
|
|
39
|
+
uploads/
|
|
40
|
+
seeds/
|
|
33
41
|
tests/
|
|
34
42
|
factories/
|
|
35
43
|
```
|
|
36
44
|
|
|
37
|
-
Small features do not need every file.
|
|
45
|
+
Small features do not need every file. The starter ships a lean subset;
|
|
46
|
+
workflow folders, `lib/` builders, and central registries appear when a
|
|
47
|
+
generator or deliberate feature change introduces that concern.
|
|
38
48
|
|
|
39
49
|
## Core Boundaries
|
|
40
50
|
|
|
@@ -129,17 +139,34 @@ feature client modules.
|
|
|
129
139
|
Feature-owned workflow definitions belong under the feature:
|
|
130
140
|
|
|
131
141
|
```txt
|
|
142
|
+
features/<feature>/domain/events/
|
|
132
143
|
features/<feature>/jobs/
|
|
144
|
+
features/<feature>/listeners/
|
|
133
145
|
features/<feature>/schedules/
|
|
134
146
|
features/<feature>/notifications/
|
|
135
147
|
features/<feature>/tasks/
|
|
136
148
|
features/<feature>/uploads/
|
|
149
|
+
features/<feature>/seeds/
|
|
137
150
|
```
|
|
138
151
|
|
|
139
152
|
Small existing apps may use feature-root `jobs.ts` or `schedules.ts`; follow
|
|
140
153
|
local style unless migrating deliberately. Central registries and service
|
|
141
154
|
contexts live under `server/`.
|
|
142
155
|
|
|
156
|
+
Context-free declarations stay top-level, such as `defineEvent(...)`.
|
|
157
|
+
Context-bound definitions should use app-bound builders created once in `lib/`,
|
|
158
|
+
for example `createJobs<AppContext>()`, `createListeners<AppContext>()`,
|
|
159
|
+
`createSchedules<AppContext>()`, `createNotifications<AppContext>()`, and
|
|
160
|
+
`createTasks<AppContext>()`.
|
|
161
|
+
|
|
162
|
+
Register workflow artifacts explicitly:
|
|
163
|
+
|
|
164
|
+
- listeners through `registerListeners(...)` in provider or infra wiring
|
|
165
|
+
- schedules in `server/schedules.ts`
|
|
166
|
+
- tasks in `server/tasks.ts`
|
|
167
|
+
- outbox events and jobs in `server/outbox.ts`
|
|
168
|
+
- seeds through the app's seed entrypoint, usually `infra/db/seed.ts`
|
|
169
|
+
|
|
143
170
|
Providers should not start unbounded background loops on server boot. Expose
|
|
144
171
|
cron routes, worker entrypoints, task runners, schedule runners, or outbox
|
|
145
172
|
drains instead.
|
|
@@ -24,6 +24,7 @@ export type ProviderPackageVariantMetadata = {
|
|
|
24
24
|
displayName?: string;
|
|
25
25
|
env?: readonly string[];
|
|
26
26
|
requiredEnv?: readonly string[];
|
|
27
|
+
requiredTables?: readonly string[];
|
|
27
28
|
registration?: ProviderPackageRegistrationMetadata;
|
|
28
29
|
};
|
|
29
30
|
|
|
@@ -33,6 +34,7 @@ export type ProviderPackageMetadata = {
|
|
|
33
34
|
appPorts?: readonly ProviderPackagePortMetadata[];
|
|
34
35
|
env?: readonly string[];
|
|
35
36
|
requiredEnv?: readonly string[];
|
|
37
|
+
requiredTables?: readonly string[];
|
|
36
38
|
registration?: ProviderPackageRegistrationMetadata;
|
|
37
39
|
variants?: readonly ProviderPackageVariantMetadata[];
|
|
38
40
|
watchers?: readonly string[];
|
|
@@ -100,6 +102,13 @@ export function parseProviderPackageMetadata(
|
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
|
|
105
|
+
const requiredTables = parseStringArray(
|
|
106
|
+
input.requiredTables,
|
|
107
|
+
"beignet.provider.requiredTables",
|
|
108
|
+
issues,
|
|
109
|
+
);
|
|
110
|
+
if (requiredTables !== undefined) metadata.requiredTables = requiredTables;
|
|
111
|
+
|
|
103
112
|
const watchers = parseStringArray(
|
|
104
113
|
input.watchers,
|
|
105
114
|
"beignet.provider.watchers",
|
|
@@ -135,6 +144,13 @@ export function parseProviderPackageMetadata(
|
|
|
135
144
|
"must not be set when beignet.provider.variants is present; declare registration on each variant instead",
|
|
136
145
|
});
|
|
137
146
|
}
|
|
147
|
+
if (input.requiredTables !== undefined) {
|
|
148
|
+
issues.push({
|
|
149
|
+
path: "beignet.provider.requiredTables",
|
|
150
|
+
message:
|
|
151
|
+
"must not be set when beignet.provider.variants is present; declare requiredTables on each variant instead",
|
|
152
|
+
});
|
|
153
|
+
}
|
|
138
154
|
}
|
|
139
155
|
|
|
140
156
|
if (issues.length > 0) {
|
|
@@ -275,6 +291,12 @@ function parseVariants(
|
|
|
275
291
|
}
|
|
276
292
|
}
|
|
277
293
|
|
|
294
|
+
const requiredTables = parseStringArray(
|
|
295
|
+
entry.requiredTables,
|
|
296
|
+
`${entryPath}.requiredTables`,
|
|
297
|
+
issues,
|
|
298
|
+
);
|
|
299
|
+
|
|
278
300
|
const registration = parseRegistration(
|
|
279
301
|
entry.registration,
|
|
280
302
|
issues,
|
|
@@ -286,6 +308,7 @@ function parseVariants(
|
|
|
286
308
|
if (displayName !== undefined) variant.displayName = displayName;
|
|
287
309
|
if (env !== undefined) variant.env = env;
|
|
288
310
|
if (requiredEnv !== undefined) variant.requiredEnv = requiredEnv;
|
|
311
|
+
if (requiredTables !== undefined) variant.requiredTables = requiredTables;
|
|
289
312
|
if (registration !== undefined) variant.registration = registration;
|
|
290
313
|
parsed.push(variant);
|
|
291
314
|
}
|