@featurevisor/core 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/coverage/clover.xml +684 -3
  3. package/coverage/coverage-final.json +4 -0
  4. package/coverage/lcov-report/builder/allocator.ts.html +1 -1
  5. package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
  6. package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
  7. package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
  8. package/coverage/lcov-report/builder/index.html +1 -1
  9. package/coverage/lcov-report/builder/revision.ts.html +1 -1
  10. package/coverage/lcov-report/builder/traffic.ts.html +1 -1
  11. package/coverage/lcov-report/index.html +25 -10
  12. package/coverage/lcov-report/linter/conditionSchema.ts.html +775 -0
  13. package/coverage/lcov-report/linter/featureSchema.ts.html +4924 -0
  14. package/coverage/lcov-report/linter/index.html +161 -0
  15. package/coverage/lcov-report/linter/schema.ts.html +1471 -0
  16. package/coverage/lcov-report/linter/segmentSchema.ts.html +130 -0
  17. package/coverage/lcov-report/list/index.html +1 -1
  18. package/coverage/lcov-report/list/matrix.ts.html +1 -1
  19. package/coverage/lcov-report/parsers/index.html +1 -1
  20. package/coverage/lcov-report/parsers/json.ts.html +1 -1
  21. package/coverage/lcov-report/parsers/yml.ts.html +1 -1
  22. package/coverage/lcov-report/tester/helpers.ts.html +1 -1
  23. package/coverage/lcov-report/tester/index.html +1 -1
  24. package/coverage/lcov.info +1471 -0
  25. package/lib/builder/buildDatafile.js +15 -1
  26. package/lib/builder/buildDatafile.js.map +1 -1
  27. package/lib/config/projectConfig.d.ts +2 -0
  28. package/lib/config/projectConfig.js +3 -1
  29. package/lib/config/projectConfig.js.map +1 -1
  30. package/lib/datasource/datasource.d.ts +6 -1
  31. package/lib/datasource/datasource.js +16 -0
  32. package/lib/datasource/datasource.js.map +1 -1
  33. package/lib/datasource/filesystemAdapter.js +10 -0
  34. package/lib/datasource/filesystemAdapter.js.map +1 -1
  35. package/lib/generate-code/typescript.js +280 -46
  36. package/lib/generate-code/typescript.js.map +1 -1
  37. package/lib/linter/conditionSchema.spec.d.ts +1 -0
  38. package/lib/linter/conditionSchema.spec.js +331 -0
  39. package/lib/linter/conditionSchema.spec.js.map +1 -0
  40. package/lib/linter/featureSchema.d.ts +129 -20
  41. package/lib/linter/featureSchema.js +489 -48
  42. package/lib/linter/featureSchema.js.map +1 -1
  43. package/lib/linter/featureSchema.spec.d.ts +1 -0
  44. package/lib/linter/featureSchema.spec.js +978 -0
  45. package/lib/linter/featureSchema.spec.js.map +1 -0
  46. package/lib/linter/lintProject.js +67 -1
  47. package/lib/linter/lintProject.js.map +1 -1
  48. package/lib/linter/schema.d.ts +42 -0
  49. package/lib/linter/schema.js +417 -0
  50. package/lib/linter/schema.js.map +1 -0
  51. package/lib/linter/schema.spec.d.ts +1 -0
  52. package/lib/linter/schema.spec.js +483 -0
  53. package/lib/linter/schema.spec.js.map +1 -0
  54. package/lib/linter/segmentSchema.spec.d.ts +1 -0
  55. package/lib/linter/segmentSchema.spec.js +231 -0
  56. package/lib/linter/segmentSchema.spec.js.map +1 -0
  57. package/lib/tester/testFeature.js +5 -3
  58. package/lib/tester/testFeature.js.map +1 -1
  59. package/lib/utils/git.js +3 -0
  60. package/lib/utils/git.js.map +1 -1
  61. package/package.json +5 -5
  62. package/src/builder/buildDatafile.ts +17 -1
  63. package/src/config/projectConfig.ts +3 -0
  64. package/src/datasource/datasource.ts +23 -0
  65. package/src/datasource/filesystemAdapter.ts +7 -0
  66. package/src/generate-code/typescript.ts +330 -49
  67. package/src/linter/conditionSchema.spec.ts +446 -0
  68. package/src/linter/featureSchema.spec.ts +1218 -0
  69. package/src/linter/featureSchema.ts +671 -69
  70. package/src/linter/lintProject.ts +84 -0
  71. package/src/linter/schema.spec.ts +617 -0
  72. package/src/linter/schema.ts +462 -0
  73. package/src/linter/segmentSchema.spec.ts +273 -0
  74. package/src/tester/testFeature.ts +5 -3
  75. package/src/utils/git.ts +2 -0
  76. package/lib/linter/propertySchema.d.ts +0 -5
  77. package/lib/linter/propertySchema.js +0 -43
  78. package/lib/linter/propertySchema.js.map +0 -1
  79. package/src/linter/propertySchema.ts +0 -47
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const conditionSchema_1 = require("./conditionSchema");
4
+ const segmentSchema_1 = require("./segmentSchema");
5
+ function minimalProjectConfig() {
6
+ return {
7
+ featuresDirectoryPath: "",
8
+ segmentsDirectoryPath: "",
9
+ attributesDirectoryPath: "",
10
+ groupsDirectoryPath: "",
11
+ schemasDirectoryPath: "",
12
+ testsDirectoryPath: "",
13
+ stateDirectoryPath: "",
14
+ datafilesDirectoryPath: "",
15
+ datafileNamePattern: "",
16
+ revisionFileName: "",
17
+ siteExportDirectoryPath: "",
18
+ environments: ["staging", "production"],
19
+ tags: ["all"],
20
+ adapter: {},
21
+ plugins: [],
22
+ defaultBucketBy: "userId",
23
+ parser: "yml",
24
+ prettyState: true,
25
+ prettyDatafile: false,
26
+ stringify: true,
27
+ };
28
+ }
29
+ const TEST_ATTRIBUTES = ["userId", "country", "device"];
30
+ function getSegmentSchema() {
31
+ const projectConfig = minimalProjectConfig();
32
+ const conditionsZodSchema = (0, conditionSchema_1.getConditionsZodSchema)(projectConfig, TEST_ATTRIBUTES);
33
+ return (0, segmentSchema_1.getSegmentZodSchema)(projectConfig, conditionsZodSchema);
34
+ }
35
+ function parseSegment(input) {
36
+ return getSegmentSchema().safeParse(input);
37
+ }
38
+ function expectSegmentSuccess(input) {
39
+ const result = parseSegment(input);
40
+ expect(result.success).toBe(true);
41
+ if (!result.success) {
42
+ const err = result.error;
43
+ const msg = err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
44
+ throw new Error(`Expected segment to pass: ${msg}`);
45
+ }
46
+ }
47
+ function expectSegmentFailure(input, messageSubstring) {
48
+ const result = parseSegment(input);
49
+ expect(result.success).toBe(false);
50
+ if (result.success)
51
+ throw new Error("Expected segment to fail");
52
+ const err = result.error;
53
+ if (messageSubstring) {
54
+ const messages = err.issues
55
+ .map((i) => (typeof i.message === "string" ? i.message : ""))
56
+ .join(" ");
57
+ expect(messages).toContain(messageSubstring);
58
+ }
59
+ return err;
60
+ }
61
+ /** Assert that an intentional mistake produces an error at the expected path with expected message. */
62
+ function expectSegmentErrorSurfaces(input, opts) {
63
+ const err = expectSegmentFailure(input, opts.messageContains);
64
+ const pathStrings = err.issues.map((i) => i.path.join("."));
65
+ const hasMatchingPath = pathStrings.some((p) => opts.pathContains.every((seg) => p.includes(seg)));
66
+ expect(hasMatchingPath).toBe(true);
67
+ }
68
+ describe("segmentSchema.ts :: getSegmentZodSchema", () => {
69
+ describe("required fields", () => {
70
+ it("accepts segment with description and conditions (plain condition)", () => {
71
+ expectSegmentSuccess({
72
+ description: "Users in Germany",
73
+ conditions: {
74
+ attribute: "country",
75
+ operator: "equals",
76
+ value: "de",
77
+ },
78
+ });
79
+ });
80
+ it("rejects segment without description", () => {
81
+ const result = parseSegment({
82
+ conditions: { attribute: "country", operator: "equals", value: "de" },
83
+ });
84
+ expect(result.success).toBe(false);
85
+ if (!result.success) {
86
+ const err = result.error;
87
+ const path = err.issues.map((i) => i.path.join(".")).join(" ");
88
+ expect(path).toContain("description");
89
+ }
90
+ });
91
+ it("rejects segment without conditions", () => {
92
+ const result = parseSegment({
93
+ description: "A segment",
94
+ });
95
+ expect(result.success).toBe(false);
96
+ });
97
+ });
98
+ describe("conditions: everyone (*)", () => {
99
+ it("accepts segment with conditions *", () => {
100
+ expectSegmentSuccess({
101
+ description: "Everyone",
102
+ conditions: "*",
103
+ });
104
+ });
105
+ });
106
+ describe("conditions: array of conditions", () => {
107
+ it("accepts segment with conditions as array", () => {
108
+ expectSegmentSuccess({
109
+ description: "Germany or France",
110
+ conditions: [
111
+ { attribute: "country", operator: "equals", value: "de" },
112
+ { attribute: "country", operator: "equals", value: "fr" },
113
+ ],
114
+ });
115
+ });
116
+ });
117
+ describe("conditions: and / or / not", () => {
118
+ it("accepts segment with and conditions", () => {
119
+ expectSegmentSuccess({
120
+ description: "Germany and mobile",
121
+ conditions: {
122
+ and: [
123
+ { attribute: "country", operator: "equals", value: "de" },
124
+ { attribute: "device", operator: "equals", value: "mobile" },
125
+ ],
126
+ },
127
+ });
128
+ });
129
+ it("accepts segment with or conditions", () => {
130
+ expectSegmentSuccess({
131
+ description: "Germany or France",
132
+ conditions: {
133
+ or: [
134
+ { attribute: "country", operator: "equals", value: "de" },
135
+ { attribute: "country", operator: "equals", value: "fr" },
136
+ ],
137
+ },
138
+ });
139
+ });
140
+ it("accepts segment with not conditions", () => {
141
+ expectSegmentSuccess({
142
+ description: "Not US",
143
+ conditions: {
144
+ not: [{ attribute: "country", operator: "equals", value: "us" }],
145
+ },
146
+ });
147
+ });
148
+ it("rejects segment when nested condition has unknown attribute", () => {
149
+ expectSegmentFailure({
150
+ description: "Bad attr",
151
+ conditions: {
152
+ and: [
153
+ { attribute: "userId", operator: "equals", value: "u1" },
154
+ { attribute: "unknownAttr", operator: "equals", value: "x" },
155
+ ],
156
+ },
157
+ }, "Unknown attribute");
158
+ });
159
+ });
160
+ describe("optional archived", () => {
161
+ it("accepts segment with archived true", () => {
162
+ expectSegmentSuccess({
163
+ description: "Old segment",
164
+ conditions: "*",
165
+ archived: true,
166
+ });
167
+ });
168
+ it("accepts segment with archived false", () => {
169
+ expectSegmentSuccess({
170
+ description: "Active segment",
171
+ conditions: "*",
172
+ archived: false,
173
+ });
174
+ });
175
+ it("accepts segment without archived", () => {
176
+ expectSegmentSuccess({
177
+ description: "Segment",
178
+ conditions: "*",
179
+ });
180
+ });
181
+ });
182
+ describe("strict: no extra keys", () => {
183
+ it("rejects segment with extra key at root", () => {
184
+ const result = parseSegment({
185
+ description: "Segment",
186
+ conditions: "*",
187
+ extraKey: true,
188
+ });
189
+ expect(result.success).toBe(false);
190
+ });
191
+ });
192
+ describe("description type", () => {
193
+ it("rejects description that is not a string", () => {
194
+ const result = parseSegment({
195
+ description: 123,
196
+ conditions: "*",
197
+ });
198
+ expect(result.success).toBe(false);
199
+ });
200
+ });
201
+ describe("errors surface properly: intentional mistakes produce correct path and message", () => {
202
+ it("missing description: error path includes description", () => {
203
+ expectSegmentErrorSurfaces({ conditions: { attribute: "country", operator: "equals", value: "de" } }, { pathContains: ["description"], messageContains: "Required" });
204
+ });
205
+ it("conditions with unknown attribute: error path goes into conditions", () => {
206
+ expectSegmentErrorSurfaces({
207
+ description: "Segment",
208
+ conditions: {
209
+ and: [
210
+ { attribute: "country", operator: "equals", value: "de" },
211
+ { attribute: "typoAttr", operator: "equals", value: "x" },
212
+ ],
213
+ },
214
+ }, { pathContains: ["conditions", "attribute"], messageContains: "Unknown attribute" });
215
+ });
216
+ it("extra key at root: parse fails and message mentions unrecognized key", () => {
217
+ const result = parseSegment({
218
+ description: "Segment",
219
+ conditions: "*",
220
+ extraKey: true,
221
+ });
222
+ expect(result.success).toBe(false);
223
+ const err = result.error;
224
+ const messages = err.issues
225
+ .map((i) => (typeof i.message === "string" ? i.message : ""))
226
+ .join(" ");
227
+ expect(messages).toMatch(/unrecognized|extraKey/i);
228
+ });
229
+ });
230
+ });
231
+ //# sourceMappingURL=segmentSchema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmentSchema.spec.js","sourceRoot":"","sources":["../../src/linter/segmentSchema.spec.ts"],"names":[],"mappings":"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"}
@@ -63,8 +63,8 @@ async function testFeature(datasource, projectConfig, test, options = {}, datafi
63
63
  ],
64
64
  logLevel,
65
65
  });
66
- const feature = await datasource.readFeature(featureKey);
67
- if (!feature) {
66
+ const parsedFeature = await datasource.readFeature(featureKey);
67
+ if (!parsedFeature) {
68
68
  testResult.notFound = true;
69
69
  testResult.passed = false;
70
70
  return testResult;
@@ -146,7 +146,9 @@ async function testFeature(datasource, projectConfig, test, options = {}, datafi
146
146
  }
147
147
  const actualValue = sdk.getVariable(featureKey, variableKey, context, overrideOptions);
148
148
  let passed;
149
- const variableSchema = feature.variablesSchema?.[variableKey];
149
+ // Use feature from datafile so variable schema is always resolved (ResolvedVariableSchema)
150
+ const featureFromDatafile = datafileContent?.features?.[featureKey];
151
+ const variableSchema = featureFromDatafile?.variablesSchema?.[variableKey];
150
152
  if (!variableSchema) {
151
153
  testResult.passed = false;
152
154
  testResultAssertion.passed = false;
@@ -1 +1 @@
1
- {"version":3,"file":"testFeature.js","sourceRoot":"","sources":["../../src/tester/testFeature.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testFeature.js","sourceRoot":"","sources":["../../src/tester/testFeature.ts"],"names":[],"mappings":"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"}
package/lib/utils/git.js CHANGED
@@ -84,6 +84,9 @@ function getCommit(gitShowOutput, options) {
84
84
  else if (relativeDir === projectConfig.groupsDirectoryPath) {
85
85
  type = "group";
86
86
  }
87
+ else if (relativeDir === projectConfig.schemasDirectoryPath) {
88
+ type = "schema";
89
+ }
87
90
  else if (relativeDir === projectConfig.testsDirectoryPath) {
88
91
  type = "test";
89
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featurevisor/core",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "Core package of Featurevisor for Node.js usage",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -40,14 +40,14 @@
40
40
  },
41
41
  "license": "MIT",
42
42
  "dependencies": {
43
- "@featurevisor/sdk": "2.10.0",
44
- "@featurevisor/site": "2.10.0",
45
- "@featurevisor/types": "2.10.0",
43
+ "@featurevisor/sdk": "2.12.0",
44
+ "@featurevisor/site": "2.12.0",
45
+ "@featurevisor/types": "2.12.0",
46
46
  "axios": "^1.3.4",
47
47
  "tar": "^7.5.7",
48
48
  "yaml": "^1.10.2",
49
49
  "yargs": "^17.7.2",
50
50
  "zod": "^3.22.4"
51
51
  },
52
- "gitHead": "28d3914f1ab4fd280ddb7c9f71ec64bf3783cc38"
52
+ "gitHead": "d7542c7da3615c821b031912e4d12ca4c81e5db2"
53
53
  }
@@ -1,5 +1,6 @@
1
1
  import * as fs from "fs";
2
2
 
3
+ import type { Schema, VariableType } from "@featurevisor/types";
3
4
  import {
4
5
  Segment,
5
6
  Feature,
@@ -102,6 +103,17 @@ export async function buildDatafile(
102
103
  const attributeKeysUsedByTag = new Set<AttributeKey>();
103
104
  const { featureRanges, featureIsInGroup } = await getFeatureRanges(projectConfig, datasource);
104
105
 
106
+ // Load schemas for resolving variable schema references in features
107
+ const schemaKeys = await datasource.listSchemas();
108
+ const schemasByKey: Record<string, Schema> = {};
109
+ for (const key of schemaKeys) {
110
+ try {
111
+ schemasByKey[key] = await datasource.readSchema(key);
112
+ } catch {
113
+ // Schema file may be invalid; skip for datafile build
114
+ }
115
+ }
116
+
105
117
  // features
106
118
  const features: Feature[] = [];
107
119
  const featuresDirectory = projectConfig.featuresDirectoryPath;
@@ -305,10 +317,14 @@ export async function buildDatafile(
305
317
 
306
318
  for (const variableKey of variableKeys) {
307
319
  const v = parsedFeature.variablesSchema[variableKey];
320
+ const resolved =
321
+ "schema" in v && v.schema
322
+ ? schemasByKey[v.schema]
323
+ : (v as { type: string; properties?: Schema; required?: string[]; items?: Schema });
308
324
 
309
325
  feature.variablesSchema[variableKey] = {
310
326
  key: variableKey,
311
- type: v.type,
327
+ type: (resolved?.type ?? "string") as VariableType,
312
328
  defaultValue: v.defaultValue,
313
329
  deprecated: v.deprecated === true ? true : undefined,
314
330
  useDefaultWhenDisabled: v.useDefaultWhenDisabled === true ? true : undefined,
@@ -11,6 +11,7 @@ export const FEATURES_DIRECTORY_NAME = "features";
11
11
  export const SEGMENTS_DIRECTORY_NAME = "segments";
12
12
  export const ATTRIBUTES_DIRECTORY_NAME = "attributes";
13
13
  export const GROUPS_DIRECTORY_NAME = "groups";
14
+ export const SCHEMAS_DIRECTORY_NAME = "schemas";
14
15
  export const TESTS_DIRECTORY_NAME = "tests";
15
16
  export const STATE_DIRECTORY_NAME = ".featurevisor";
16
17
  export const DATAFILES_DIRECTORY_NAME = "datafiles";
@@ -44,6 +45,7 @@ export interface ProjectConfig {
44
45
  segmentsDirectoryPath: string;
45
46
  attributesDirectoryPath: string;
46
47
  groupsDirectoryPath: string;
48
+ schemasDirectoryPath: string;
47
49
  testsDirectoryPath: string;
48
50
  stateDirectoryPath: string;
49
51
  datafilesDirectoryPath: string;
@@ -92,6 +94,7 @@ export function getProjectConfig(rootDirectoryPath: string): ProjectConfig {
92
94
  segmentsDirectoryPath: path.join(rootDirectoryPath, SEGMENTS_DIRECTORY_NAME),
93
95
  attributesDirectoryPath: path.join(rootDirectoryPath, ATTRIBUTES_DIRECTORY_NAME),
94
96
  groupsDirectoryPath: path.join(rootDirectoryPath, GROUPS_DIRECTORY_NAME),
97
+ schemasDirectoryPath: path.join(rootDirectoryPath, SCHEMAS_DIRECTORY_NAME),
95
98
  testsDirectoryPath: path.join(rootDirectoryPath, TESTS_DIRECTORY_NAME),
96
99
  stateDirectoryPath: path.join(rootDirectoryPath, STATE_DIRECTORY_NAME),
97
100
  datafilesDirectoryPath: path.join(rootDirectoryPath, DATAFILES_DIRECTORY_NAME),
@@ -11,6 +11,8 @@ import type {
11
11
  AttributeKey,
12
12
  DatafileContent,
13
13
  EntityType,
14
+ SchemaKey,
15
+ Schema,
14
16
  } from "@featurevisor/types";
15
17
 
16
18
  import { ProjectConfig } from "../config";
@@ -204,6 +206,27 @@ export class Datasource {
204
206
  return this.adapter.deleteEntity("group", groupKey);
205
207
  }
206
208
 
209
+ // schemas
210
+ listSchemas() {
211
+ return this.adapter.listEntities("schema");
212
+ }
213
+
214
+ schemaExists(schemaKey: SchemaKey) {
215
+ return this.adapter.entityExists("schema", schemaKey);
216
+ }
217
+
218
+ readSchema(schemaKey: SchemaKey) {
219
+ return this.adapter.readEntity<Schema>("schema", schemaKey);
220
+ }
221
+
222
+ writeSchema(schemaKey: SchemaKey, schema: Schema) {
223
+ return this.adapter.writeEntity<Schema>("schema", schemaKey, schema);
224
+ }
225
+
226
+ deleteSchema(schemaKey: SchemaKey) {
227
+ return this.adapter.deleteEntity("schema", schemaKey);
228
+ }
229
+
207
230
  // tests
208
231
  listTests() {
209
232
  return this.adapter.listEntities("test");
@@ -73,6 +73,8 @@ export class FilesystemAdapter extends Adapter {
73
73
  return this.config.groupsDirectoryPath;
74
74
  } else if (entityType === "segment") {
75
75
  return this.config.segmentsDirectoryPath;
76
+ } else if (entityType === "schema") {
77
+ return this.config.schemasDirectoryPath;
76
78
  } else if (entityType === "test") {
77
79
  return this.config.testsDirectoryPath;
78
80
  }
@@ -313,6 +315,8 @@ export class FilesystemAdapter extends Adapter {
313
315
  pathPatterns = [this.config.featuresDirectoryPath];
314
316
  } else if (entityType === "group") {
315
317
  pathPatterns = [this.config.groupsDirectoryPath];
318
+ } else if (entityType === "schema") {
319
+ pathPatterns = [this.config.schemasDirectoryPath];
316
320
  } else if (entityType === "test") {
317
321
  pathPatterns = [this.config.testsDirectoryPath];
318
322
  }
@@ -322,6 +326,7 @@ export class FilesystemAdapter extends Adapter {
322
326
  this.config.attributesDirectoryPath,
323
327
  this.config.segmentsDirectoryPath,
324
328
  this.config.groupsDirectoryPath,
329
+ this.config.schemasDirectoryPath,
325
330
  this.config.testsDirectoryPath,
326
331
  ];
327
332
  }
@@ -368,6 +373,8 @@ export class FilesystemAdapter extends Adapter {
368
373
  type = "feature";
369
374
  } else if (relativeDir === this.config.groupsDirectoryPath) {
370
375
  type = "group";
376
+ } else if (relativeDir === this.config.schemasDirectoryPath) {
377
+ type = "schema";
371
378
  } else if (relativeDir === this.config.testsDirectoryPath) {
372
379
  type = "test";
373
380
  } else {