@antelopejs/interface-data-api 0.1.10 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/components.d.ts +37 -6
  2. package/dist/components.js +118 -50
  3. package/dist/components.js.map +1 -1
  4. package/dist/index.js +8 -8
  5. package/dist/index.js.map +1 -1
  6. package/dist/metadata.d.ts +24 -3
  7. package/dist/metadata.js +10 -6
  8. package/dist/metadata.js.map +1 -1
  9. package/dist/tests/components/cross_instance.test.d.ts +1 -0
  10. package/dist/tests/components/cross_instance.test.js +205 -0
  11. package/dist/tests/components/cross_instance.test.js.map +1 -0
  12. package/dist/tests/components/mandatory.test.js +27 -6
  13. package/dist/tests/components/mandatory.test.js.map +1 -1
  14. package/dist/tests/components/parsed_value.test.d.ts +1 -0
  15. package/dist/tests/components/parsed_value.test.js +152 -0
  16. package/dist/tests/components/parsed_value.test.js.map +1 -0
  17. package/dist/tests/components/partial_edit.test.d.ts +1 -0
  18. package/dist/tests/components/partial_edit.test.js +277 -0
  19. package/dist/tests/components/partial_edit.test.js.map +1 -0
  20. package/dist/tests/helpers/other-instance.d.ts +13 -0
  21. package/dist/tests/helpers/other-instance.js +46 -0
  22. package/dist/tests/helpers/other-instance.js.map +1 -0
  23. package/dist/tests/index/inheritance.test.d.ts +1 -0
  24. package/dist/tests/index/inheritance.test.js +122 -0
  25. package/dist/tests/index/inheritance.test.js.map +1 -0
  26. package/docs/10.joined.md +1 -1
  27. package/docs/2.data-controllers.md +1 -1
  28. package/docs/3.routes.md +13 -1
  29. package/docs/5.validators.md +29 -8
  30. package/docs/7.foreign-keys.md +1 -1
  31. package/package.json +6 -6
  32. package/skills/data-api-interface/SKILL.md +7 -1
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const node_path_1 = __importDefault(require("node:path"));
16
+ const chai_1 = require("chai");
17
+ const interface_api_1 = require("@antelopejs/interface-api");
18
+ const interface_database_1 = require("@antelopejs/interface-database");
19
+ const interface_data_api_1 = require("@antelopejs/interface-data-api");
20
+ const metadata_1 = require("@antelopejs/interface-data-api/metadata");
21
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
22
+ const utils_1 = require("../utils");
23
+ const currentTestName = node_path_1.default
24
+ .basename(__filename)
25
+ .replace(/\.test\.(ts|js)$/, "");
26
+ const eventTableName = `events-${currentTestName}`;
27
+ const schemaName = "default";
28
+ const startsAt = "2026-01-15T09:30:00.000Z";
29
+ const editedStartsAt = "2026-02-20T14:00:00.000Z";
30
+ let Event = class Event extends interface_database_decorators_1.Table {
31
+ };
32
+ __decorate([
33
+ (0, interface_database_decorators_1.Field)("string"),
34
+ __metadata("design:type", String)
35
+ ], Event.prototype, "name", void 0);
36
+ __decorate([
37
+ (0, interface_database_decorators_1.Field)("date"),
38
+ __metadata("design:type", Date)
39
+ ], Event.prototype, "startsAt", void 0);
40
+ __decorate([
41
+ (0, interface_database_decorators_1.Field)("string"),
42
+ __metadata("design:type", String)
43
+ ], Event.prototype, "code", void 0);
44
+ Event = __decorate([
45
+ (0, interface_database_decorators_1.RegisterTable)(eventTableName, schemaName)
46
+ ], Event);
47
+ class EventModel extends (0, interface_database_decorators_1.BasicDataModel)(Event, eventTableName) {
48
+ }
49
+ function parseDate(value) {
50
+ if (typeof value !== "string" || Number.isNaN(Date.parse(value))) {
51
+ return { success: false };
52
+ }
53
+ return { success: true, data: new Date(value) };
54
+ }
55
+ async function normalizeCode(value) {
56
+ if (typeof value !== "string") {
57
+ return { success: false };
58
+ }
59
+ return { success: true, data: value.trim().toUpperCase() };
60
+ }
61
+ describe("Field Validator parsed value", () => {
62
+ it("writes the parsed value on new", async () => await writesParsedValueOnNew());
63
+ it("writes the parsed value on edit", async () => await writesParsedValueOnEdit());
64
+ it("writes the value of an asynchronous parse", async () => await writesAsyncParsedValue());
65
+ it("rejects a failed parse with the invalid field message", async () => await rejectsFailedParse());
66
+ });
67
+ async function _dropEventTable() {
68
+ const schema = interface_database_1.Schema.get(schemaName);
69
+ if (schema) {
70
+ await schema.instance().table(eventTableName).delete();
71
+ }
72
+ }
73
+ async function _createDataController(testName, event) {
74
+ let _ParsedValueTestAPI = class _ParsedValueTestAPI extends (0, interface_data_api_1.DataController)(Event, { new: interface_data_api_1.DefaultRoutes.New, edit: interface_data_api_1.DefaultRoutes.Edit }, (0, interface_api_1.Controller)(`/${testName}`)) {
75
+ };
76
+ __decorate([
77
+ (0, metadata_1.ModelReference)(),
78
+ (0, interface_database_decorators_1.Model)(EventModel),
79
+ __metadata("design:type", EventModel)
80
+ ], _ParsedValueTestAPI.prototype, "eventModel", void 0);
81
+ __decorate([
82
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
83
+ __metadata("design:type", String)
84
+ ], _ParsedValueTestAPI.prototype, "name", void 0);
85
+ __decorate([
86
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
87
+ (0, metadata_1.Validator)(parseDate),
88
+ __metadata("design:type", Date)
89
+ ], _ParsedValueTestAPI.prototype, "startsAt", void 0);
90
+ __decorate([
91
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
92
+ (0, metadata_1.Validator)(normalizeCode),
93
+ __metadata("design:type", String)
94
+ ], _ParsedValueTestAPI.prototype, "code", void 0);
95
+ _ParsedValueTestAPI = __decorate([
96
+ (0, interface_data_api_1.RegisterDataController)()
97
+ ], _ParsedValueTestAPI);
98
+ await (0, interface_database_decorators_1.RegisterSchema)(schemaName);
99
+ await _dropEventTable();
100
+ const eventModel = new EventModel((0, utils_1.getSchemaInstance)(schemaName));
101
+ if (event) {
102
+ const insertResult = await eventModel.insert(event);
103
+ return { id: insertResult[0], eventModel };
104
+ }
105
+ return { eventModel };
106
+ }
107
+ async function writesParsedValueOnNew() {
108
+ const { eventModel } = await _createDataController((0, utils_1.getFunctionName)());
109
+ const response = await (0, utils_1.newRequest)((0, utils_1.getFunctionName)(), {
110
+ name: "Launch",
111
+ startsAt,
112
+ });
113
+ (0, chai_1.expect)(response.status).to.equal(200);
114
+ const [id] = (await response.json());
115
+ const event = await eventModel.get(id);
116
+ (0, chai_1.expect)(event?.startsAt).to.be.instanceOf(Date);
117
+ (0, chai_1.expect)(event?.startsAt.toISOString()).to.equal(startsAt);
118
+ }
119
+ async function writesParsedValueOnEdit() {
120
+ const { id, eventModel } = await _createDataController((0, utils_1.getFunctionName)(), {
121
+ name: "Launch",
122
+ startsAt: new Date(startsAt),
123
+ });
124
+ if (!id)
125
+ throw new Error("Expected id from _createDataController");
126
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { startsAt: editedStartsAt }, { id });
127
+ (0, chai_1.expect)(response.status).to.equal(200);
128
+ const event = await eventModel.get(id);
129
+ (0, chai_1.expect)(event?.startsAt).to.be.instanceOf(Date);
130
+ (0, chai_1.expect)(event?.startsAt.toISOString()).to.equal(editedStartsAt);
131
+ }
132
+ async function writesAsyncParsedValue() {
133
+ const { eventModel } = await _createDataController((0, utils_1.getFunctionName)());
134
+ const response = await (0, utils_1.newRequest)((0, utils_1.getFunctionName)(), {
135
+ name: "Launch",
136
+ code: " launch-26 ",
137
+ });
138
+ (0, chai_1.expect)(response.status).to.equal(200);
139
+ const [id] = (await response.json());
140
+ const event = await eventModel.get(id);
141
+ (0, chai_1.expect)(event?.code).to.equal("LAUNCH-26");
142
+ }
143
+ async function rejectsFailedParse() {
144
+ await _createDataController((0, utils_1.getFunctionName)());
145
+ const response = await (0, utils_1.newRequest)((0, utils_1.getFunctionName)(), {
146
+ name: "Launch",
147
+ startsAt: "not-a-date",
148
+ });
149
+ (0, chai_1.expect)(response.status).to.equal(400);
150
+ (0, chai_1.expect)(await response.text()).to.include("Invalid field type(s): startsAt");
151
+ }
152
+ //# sourceMappingURL=parsed_value.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsed_value.test.js","sourceRoot":"","sources":["../../../src/tests/components/parsed_value.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const node_path_1 = __importDefault(require("node:path"));
16
+ const chai_1 = require("chai");
17
+ const interface_api_1 = require("@antelopejs/interface-api");
18
+ const interface_database_1 = require("@antelopejs/interface-database");
19
+ const interface_data_api_1 = require("@antelopejs/interface-data-api");
20
+ const metadata_1 = require("@antelopejs/interface-data-api/metadata");
21
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
22
+ const constants_1 = require("../constants");
23
+ const utils_1 = require("../utils");
24
+ const currentTestName = node_path_1.default
25
+ .basename(__filename)
26
+ .replace(/\.test\.(ts|js)$/, "");
27
+ const articleTableName = `articles-${currentTestName}`;
28
+ const schemaName = "default";
29
+ const defaultSlug = "default-slug";
30
+ const allLocales = "*";
31
+ const missingRowId = "missing-row-id";
32
+ let Article = class Article extends interface_database_decorators_1.Table.with(interface_database_decorators_1.LocalizationModifier) {
33
+ };
34
+ __decorate([
35
+ (0, interface_database_decorators_1.Field)("string"),
36
+ __metadata("design:type", String)
37
+ ], Article.prototype, "reference", void 0);
38
+ __decorate([
39
+ (0, interface_database_decorators_1.Field)("string"),
40
+ __metadata("design:type", String)
41
+ ], Article.prototype, "author", void 0);
42
+ __decorate([
43
+ (0, interface_database_decorators_1.Field)("string"),
44
+ __metadata("design:type", Object)
45
+ ], Article.prototype, "notes", void 0);
46
+ __decorate([
47
+ (0, interface_database_decorators_1.Field)("string"),
48
+ __metadata("design:type", String)
49
+ ], Article.prototype, "slug", void 0);
50
+ __decorate([
51
+ (0, interface_database_decorators_1.Localized)(),
52
+ __metadata("design:type", String)
53
+ ], Article.prototype, "title", void 0);
54
+ __decorate([
55
+ (0, interface_database_decorators_1.Localized)(),
56
+ __metadata("design:type", String)
57
+ ], Article.prototype, "summary", void 0);
58
+ Article = __decorate([
59
+ (0, interface_database_decorators_1.RegisterTable)(articleTableName, schemaName)
60
+ ], Article);
61
+ class ArticleModel extends (0, interface_database_decorators_1.BasicDataModel)(Article, articleTableName) {
62
+ }
63
+ const storedArticle = {
64
+ reference: "ART-001",
65
+ author: "Alice",
66
+ notes: "Draft notes",
67
+ slug: "custom-slug",
68
+ };
69
+ const localizedArticle = {
70
+ reference: "ART-002",
71
+ title: { en: "Title", fr: "Titre" },
72
+ summary: { en: "Summary", fr: "Résumé" },
73
+ };
74
+ describe("Partial edit", () => {
75
+ it("leaves the fields absent from the body unchanged", async () => await leavesAbsentFieldsUnchanged());
76
+ it("clears a field sent as null", async () => await clearsNullField());
77
+ it("skips the setters of fields absent from the body", async () => await skipsSettersOfAbsentFields());
78
+ it("runs the setters of fields present in the body", async () => await runsSettersOfPresentFields());
79
+ it("still runs every setter on new", async () => await runsEverySetterOnNew());
80
+ it("keeps the other languages of a written localized field", async () => await keepsOtherLanguagesOfWrittenField());
81
+ it("keeps the localized fields absent from the body", async () => await keepsAbsentLocalizedFields());
82
+ it("answers 404 for a missing row", async () => await answersNotFound());
83
+ it("answers 400 for a body that is not JSON", async () => await answersBadRequestForInvalidJson());
84
+ it("answers 400 for a body that is not a JSON object", async () => await answersBadRequestForNonObjectBody());
85
+ it("answers 400 on new for a body that is not a JSON object", async () => await answersBadRequestForNonObjectBodyOnNew());
86
+ });
87
+ async function _dropArticleTable() {
88
+ const schema = interface_database_1.Schema.get(schemaName);
89
+ if (schema) {
90
+ await schema.instance().table(articleTableName).delete();
91
+ }
92
+ }
93
+ async function _createDataController(testName, article) {
94
+ let _PartialEditTestAPI = class _PartialEditTestAPI extends (0, interface_data_api_1.DataController)(Article, {
95
+ get: interface_data_api_1.DefaultRoutes.Get,
96
+ new: interface_data_api_1.DefaultRoutes.New,
97
+ edit: interface_data_api_1.DefaultRoutes.Edit,
98
+ }, (0, interface_api_1.Controller)(`/${testName}`)) {
99
+ set slug(value) {
100
+ this.table.slug = value ?? defaultSlug;
101
+ }
102
+ };
103
+ __decorate([
104
+ (0, metadata_1.ModelReference)(),
105
+ (0, interface_database_decorators_1.Model)(ArticleModel),
106
+ __metadata("design:type", ArticleModel)
107
+ ], _PartialEditTestAPI.prototype, "articleModel", void 0);
108
+ __decorate([
109
+ (0, interface_api_1.Parameter)("locale", "query"),
110
+ (0, metadata_1.ModifierKey)(interface_database_decorators_1.LocalizationModifier),
111
+ __metadata("design:type", String)
112
+ ], _PartialEditTestAPI.prototype, "locale", void 0);
113
+ __decorate([
114
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
115
+ __metadata("design:type", String)
116
+ ], _PartialEditTestAPI.prototype, "reference", void 0);
117
+ __decorate([
118
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
119
+ __metadata("design:type", String)
120
+ ], _PartialEditTestAPI.prototype, "author", void 0);
121
+ __decorate([
122
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
123
+ __metadata("design:type", Object)
124
+ ], _PartialEditTestAPI.prototype, "notes", void 0);
125
+ __decorate([
126
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
127
+ __metadata("design:type", String)
128
+ ], _PartialEditTestAPI.prototype, "title", void 0);
129
+ __decorate([
130
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
131
+ __metadata("design:type", String)
132
+ ], _PartialEditTestAPI.prototype, "summary", void 0);
133
+ __decorate([
134
+ (0, metadata_1.Access)(metadata_1.AccessMode.WriteOnly),
135
+ __metadata("design:type", Object),
136
+ __metadata("design:paramtypes", [Object])
137
+ ], _PartialEditTestAPI.prototype, "slug", null);
138
+ _PartialEditTestAPI = __decorate([
139
+ (0, interface_data_api_1.RegisterDataController)()
140
+ ], _PartialEditTestAPI);
141
+ await (0, interface_database_decorators_1.RegisterSchema)(schemaName);
142
+ await _dropArticleTable();
143
+ const articleModel = new ArticleModel((0, utils_1.getSchemaInstance)(schemaName));
144
+ if (article) {
145
+ const insertResult = await articleModel.insert(article);
146
+ return { id: insertResult[0], articleModel };
147
+ }
148
+ return { articleModel };
149
+ }
150
+ async function _createLocalizedArticle(testName) {
151
+ await _createDataController(testName);
152
+ const response = await (0, utils_1.newRequest)(testName, localizedArticle, {
153
+ locale: allLocales,
154
+ });
155
+ (0, chai_1.expect)(response.status).to.equal(200);
156
+ const [id] = (await response.json());
157
+ return id;
158
+ }
159
+ async function _getLocalized(testName, id, locale) {
160
+ const response = await (0, utils_1.getRequest)(testName, { id, locale });
161
+ (0, chai_1.expect)(response.status).to.equal(200);
162
+ return (await response.json());
163
+ }
164
+ async function _rawRequest(testName, uri, method, body, queryParams = {}) {
165
+ return await fetch(`${constants_1.URL_BASE}/${testName}/${uri}?${new URLSearchParams(queryParams).toString()}`, { method, headers: { "Content-Type": "application/json" }, body });
166
+ }
167
+ async function leavesAbsentFieldsUnchanged() {
168
+ const { id, articleModel } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
169
+ if (!id)
170
+ throw new Error("Expected id from _createDataController");
171
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { author: "Bob" }, { id });
172
+ (0, chai_1.expect)(response.status).to.equal(200);
173
+ const article = await articleModel.get(id);
174
+ (0, chai_1.expect)(article).to.include({
175
+ author: "Bob",
176
+ reference: storedArticle.reference,
177
+ notes: storedArticle.notes,
178
+ slug: storedArticle.slug,
179
+ });
180
+ }
181
+ async function clearsNullField() {
182
+ const { id, articleModel } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
183
+ if (!id)
184
+ throw new Error("Expected id from _createDataController");
185
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { notes: null }, { id });
186
+ (0, chai_1.expect)(response.status).to.equal(200);
187
+ const article = await articleModel.get(id);
188
+ (0, chai_1.expect)(article?.notes).to.equal(null);
189
+ (0, chai_1.expect)(article?.reference).to.equal(storedArticle.reference);
190
+ }
191
+ async function skipsSettersOfAbsentFields() {
192
+ const { id, articleModel } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
193
+ if (!id)
194
+ throw new Error("Expected id from _createDataController");
195
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { author: "Bob" }, { id });
196
+ (0, chai_1.expect)(response.status).to.equal(200);
197
+ const article = await articleModel.get(id);
198
+ (0, chai_1.expect)(article?.slug).to.equal(storedArticle.slug);
199
+ }
200
+ async function runsSettersOfPresentFields() {
201
+ const { id, articleModel } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
202
+ if (!id)
203
+ throw new Error("Expected id from _createDataController");
204
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { slug: "edited-slug" }, { id });
205
+ (0, chai_1.expect)(response.status).to.equal(200);
206
+ const article = await articleModel.get(id);
207
+ (0, chai_1.expect)(article?.slug).to.equal("edited-slug");
208
+ }
209
+ async function runsEverySetterOnNew() {
210
+ const { articleModel } = await _createDataController((0, utils_1.getFunctionName)());
211
+ const response = await (0, utils_1.newRequest)((0, utils_1.getFunctionName)(), {
212
+ reference: "ART-003",
213
+ });
214
+ (0, chai_1.expect)(response.status).to.equal(200);
215
+ const [id] = (await response.json());
216
+ const article = await articleModel.get(id);
217
+ (0, chai_1.expect)(article?.slug).to.equal(defaultSlug);
218
+ }
219
+ async function keepsOtherLanguagesOfWrittenField() {
220
+ const id = await _createLocalizedArticle((0, utils_1.getFunctionName)());
221
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { title: "Nouveau titre" }, { id, locale: "fr" });
222
+ (0, chai_1.expect)(response.status).to.equal(200);
223
+ (0, chai_1.expect)(await _getLocalized((0, utils_1.getFunctionName)(), id, "fr")).to.include({
224
+ title: "Nouveau titre",
225
+ summary: localizedArticle.summary.fr,
226
+ });
227
+ (0, chai_1.expect)(await _getLocalized((0, utils_1.getFunctionName)(), id, "en")).to.include({
228
+ title: localizedArticle.title.en,
229
+ summary: localizedArticle.summary.en,
230
+ });
231
+ }
232
+ async function keepsAbsentLocalizedFields() {
233
+ const id = await _createLocalizedArticle((0, utils_1.getFunctionName)());
234
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { reference: "ART-002-B" }, { id, locale: allLocales });
235
+ (0, chai_1.expect)(response.status).to.equal(200);
236
+ (0, chai_1.expect)(await _getLocalized((0, utils_1.getFunctionName)(), id, "fr")).to.include({
237
+ title: localizedArticle.title.fr,
238
+ summary: localizedArticle.summary.fr,
239
+ });
240
+ (0, chai_1.expect)(await _getLocalized((0, utils_1.getFunctionName)(), id, "en")).to.include({
241
+ title: localizedArticle.title.en,
242
+ summary: localizedArticle.summary.en,
243
+ });
244
+ }
245
+ async function answersNotFound() {
246
+ await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
247
+ const response = await (0, utils_1.editRequest)((0, utils_1.getFunctionName)(), { author: "Bob" }, { id: missingRowId });
248
+ (0, chai_1.expect)(response.status).to.equal(404);
249
+ }
250
+ async function answersBadRequestForInvalidJson() {
251
+ const { id } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
252
+ if (!id)
253
+ throw new Error("Expected id from _createDataController");
254
+ const response = await _rawRequest((0, utils_1.getFunctionName)(), "edit", "PUT", "{", {
255
+ id,
256
+ });
257
+ (0, chai_1.expect)(response.status).to.equal(400);
258
+ }
259
+ async function answersBadRequestForNonObjectBody() {
260
+ const { id } = await _createDataController((0, utils_1.getFunctionName)(), storedArticle);
261
+ if (!id)
262
+ throw new Error("Expected id from _createDataController");
263
+ for (const body of ["[]", "null", '"text"', "42"]) {
264
+ const response = await _rawRequest((0, utils_1.getFunctionName)(), "edit", "PUT", body, {
265
+ id,
266
+ });
267
+ (0, chai_1.expect)(response.status).to.equal(400, `body ${body}`);
268
+ }
269
+ }
270
+ async function answersBadRequestForNonObjectBodyOnNew() {
271
+ await _createDataController((0, utils_1.getFunctionName)());
272
+ for (const body of ["{", "[]", "null"]) {
273
+ const response = await _rawRequest((0, utils_1.getFunctionName)(), "new", "POST", body);
274
+ (0, chai_1.expect)(response.status).to.equal(400, `body ${body}`);
275
+ }
276
+ }
277
+ //# sourceMappingURL=partial_edit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial_edit.test.js","sourceRoot":"","sources":["../../../src/tests/components/partial_edit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type ModuleRequire = (request: string) => unknown;
2
+ /**
3
+ * Evaluates built packages a second time, the way the core gives each
4
+ * provider binding its own copy of an interface: every file under `folders`
5
+ * is loaded again, with its own classes, symbols and registries, while
6
+ * anything else (interface-core, third-party dependencies) stays the copy
7
+ * already loaded.
8
+ *
9
+ * @param folders Build output folders to evaluate again
10
+ * @returns A `require` resolving into the second copy
11
+ */
12
+ export declare function CreateOtherInstance(folders: string[]): ModuleRequire;
13
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CreateOtherInstance = CreateOtherInstance;
7
+ const node_module_1 = __importDefault(require("node:module"));
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const internals = node_module_1.default;
11
+ /**
12
+ * Evaluates built packages a second time, the way the core gives each
13
+ * provider binding its own copy of an interface: every file under `folders`
14
+ * is loaded again, with its own classes, symbols and registries, while
15
+ * anything else (interface-core, third-party dependencies) stays the copy
16
+ * already loaded.
17
+ *
18
+ * @param folders Build output folders to evaluate again
19
+ * @returns A `require` resolving into the second copy
20
+ */
21
+ function CreateOtherInstance(folders) {
22
+ const owned = folders.map((folder) => (0, node_fs_1.realpathSync)(folder) + node_path_1.default.sep);
23
+ const modules = new Map();
24
+ const load = (filename, parent) => {
25
+ const cached = modules.get(filename);
26
+ if (cached) {
27
+ return cached.exports;
28
+ }
29
+ const loaded = new node_module_1.default(filename, parent);
30
+ loaded.filename = filename;
31
+ loaded.paths = internals._nodeModulePaths(node_path_1.default.dirname(filename));
32
+ loaded.require = ((request) => requireFrom(loaded, request));
33
+ modules.set(filename, loaded);
34
+ loaded.load(filename);
35
+ return loaded.exports;
36
+ };
37
+ const requireFrom = (parent, request) => {
38
+ const filename = internals._resolveFilename(request, parent);
39
+ const isOwned = owned.some((root) => filename.startsWith(root));
40
+ return isOwned
41
+ ? load(filename, parent)
42
+ : node_module_1.default.prototype.require.call(parent, request);
43
+ };
44
+ return (request) => requireFrom(module, request);
45
+ }
46
+ //# sourceMappingURL=other-instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"other-instance.js","sourceRoot":"","sources":["../../../src/tests/helpers/other-instance.ts"],"names":[],"mappings":";;;;;AA2BA,kDA4BC;AAvDD,8DAAiC;AACjC,qCAAuC;AACvC,0DAA6B;AAa7B,MAAM,SAAS,GAAG,qBAAoC,CAAC;AAEvD;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,OAAiB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,MAAM,CAAC,GAAG,mBAAI,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAW,EAAE;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,qBAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,gBAAgB,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE,CACpC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAoC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,OAAe,EAAW,EAAE;QAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,OAAO;YACZ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,CAAC,CAAC,qBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO,CAAC,OAAe,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1 @@
1
+ export {};