qnce-engine 1.2.2 → 1.3.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.
- package/README.md +12 -6
- package/dist/adapters/contracts.d.ts +23 -0
- package/dist/adapters/contracts.d.ts.map +1 -0
- package/dist/adapters/contracts.js +5 -0
- package/dist/adapters/contracts.js.map +1 -0
- package/dist/adapters/story/CustomJSONAdapter.d.ts +10 -0
- package/dist/adapters/story/CustomJSONAdapter.d.ts.map +1 -0
- package/dist/adapters/story/CustomJSONAdapter.js +94 -0
- package/dist/adapters/story/CustomJSONAdapter.js.map +1 -0
- package/dist/adapters/story/InkAdapter.d.ts +10 -0
- package/dist/adapters/story/InkAdapter.d.ts.map +1 -0
- package/dist/adapters/story/InkAdapter.js +44 -0
- package/dist/adapters/story/InkAdapter.js.map +1 -0
- package/dist/adapters/story/TwisonAdapter.d.ts +10 -0
- package/dist/adapters/story/TwisonAdapter.d.ts.map +1 -0
- package/dist/adapters/story/TwisonAdapter.js +66 -0
- package/dist/adapters/story/TwisonAdapter.js.map +1 -0
- package/dist/cli/import.d.ts +3 -0
- package/dist/cli/import.d.ts.map +1 -0
- package/dist/cli/import.js +166 -0
- package/dist/cli/import.js.map +1 -0
- package/dist/cli/play.d.ts.map +1 -1
- package/dist/cli/play.js +86 -2
- package/dist/cli/play.js.map +1 -1
- package/dist/engine/core.d.ts +25 -0
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +52 -0
- package/dist/engine/core.js.map +1 -1
- package/dist/persistence/StorageAdapters.d.ts +106 -0
- package/dist/persistence/StorageAdapters.d.ts.map +1 -0
- package/dist/persistence/StorageAdapters.js +383 -0
- package/dist/persistence/StorageAdapters.js.map +1 -0
- package/dist/schemas/story-data.schema.json +52 -0
- package/dist/schemas/validateStoryData.d.ts +8 -0
- package/dist/schemas/validateStoryData.d.ts.map +1 -0
- package/dist/schemas/validateStoryData.js +16 -0
- package/dist/schemas/validateStoryData.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// QNCE Engine - Storage Adapter Implementations
|
|
3
|
+
// Provides pluggable persistence backends implementing StorageAdapter
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.IndexedDBStorageAdapter = exports.FileStorageAdapter = exports.SessionStorageAdapter = exports.LocalStorageAdapter = exports.MemoryStorageAdapter = void 0;
|
|
39
|
+
exports.createStorageAdapter = createStorageAdapter;
|
|
40
|
+
// Utility: safe JSON parse with error capture
|
|
41
|
+
function safeParse(data) {
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(data);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Base adapter with common helpers
|
|
50
|
+
class BaseAdapter {
|
|
51
|
+
buildResult(success, data, error) {
|
|
52
|
+
return success ? { success, data } : { success, error };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// In-memory adapter (useful for tests & ephemeral sessions)
|
|
56
|
+
class MemoryStorageAdapter extends BaseAdapter {
|
|
57
|
+
store = new Map();
|
|
58
|
+
async save(key, data) {
|
|
59
|
+
const start = performance.now();
|
|
60
|
+
this.store.set(key, data);
|
|
61
|
+
return this.buildResult(true, { size: JSON.stringify(data).length, duration: performance.now() - start });
|
|
62
|
+
}
|
|
63
|
+
async load(key) { return this.store.get(key) || null; }
|
|
64
|
+
async delete(key) { return this.store.delete(key); }
|
|
65
|
+
async list() { return Array.from(this.store.keys()); }
|
|
66
|
+
async exists(key) { return this.store.has(key); }
|
|
67
|
+
async getStats() { return { totalSize: Array.from(this.store.values()).reduce((s, v) => s + JSON.stringify(v).length, 0), keyCount: this.store.size }; }
|
|
68
|
+
async clear() { this.store.clear(); return true; }
|
|
69
|
+
}
|
|
70
|
+
exports.MemoryStorageAdapter = MemoryStorageAdapter;
|
|
71
|
+
// Browser localStorage adapter
|
|
72
|
+
class LocalStorageAdapter extends BaseAdapter {
|
|
73
|
+
prefix;
|
|
74
|
+
constructor(prefix = 'qnce:') { super(); this.prefix = prefix; }
|
|
75
|
+
k(key) { return this.prefix + key; }
|
|
76
|
+
async save(key, data) {
|
|
77
|
+
if (typeof localStorage === 'undefined')
|
|
78
|
+
return this.buildResult(false, undefined, 'localStorage not available');
|
|
79
|
+
const start = performance.now();
|
|
80
|
+
const serialized = JSON.stringify(data);
|
|
81
|
+
try {
|
|
82
|
+
localStorage.setItem(this.k(key), serialized);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
return this.buildResult(false, undefined, e.message);
|
|
86
|
+
}
|
|
87
|
+
return this.buildResult(true, { size: serialized.length, duration: performance.now() - start });
|
|
88
|
+
}
|
|
89
|
+
async load(key) {
|
|
90
|
+
if (typeof localStorage === 'undefined')
|
|
91
|
+
return null;
|
|
92
|
+
const raw = localStorage.getItem(this.k(key));
|
|
93
|
+
return raw ? safeParse(raw) : null;
|
|
94
|
+
}
|
|
95
|
+
async delete(key) { if (typeof localStorage === 'undefined')
|
|
96
|
+
return false; localStorage.removeItem(this.k(key)); return true; }
|
|
97
|
+
async list() {
|
|
98
|
+
if (typeof localStorage === 'undefined')
|
|
99
|
+
return [];
|
|
100
|
+
const keys = [];
|
|
101
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
102
|
+
const k = localStorage.key(i);
|
|
103
|
+
if (k && k.startsWith(this.prefix))
|
|
104
|
+
keys.push(k.substring(this.prefix.length));
|
|
105
|
+
}
|
|
106
|
+
return keys;
|
|
107
|
+
}
|
|
108
|
+
async exists(key) { if (typeof localStorage === 'undefined')
|
|
109
|
+
return false; return localStorage.getItem(this.k(key)) !== null; }
|
|
110
|
+
async getStats() {
|
|
111
|
+
if (typeof localStorage === 'undefined')
|
|
112
|
+
return { totalSize: 0, keyCount: 0 };
|
|
113
|
+
let total = 0;
|
|
114
|
+
let count = 0;
|
|
115
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
116
|
+
const k = localStorage.key(i);
|
|
117
|
+
if (k && k.startsWith(this.prefix)) {
|
|
118
|
+
const v = localStorage.getItem(k) || '';
|
|
119
|
+
total += v.length;
|
|
120
|
+
count++;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { totalSize: total, keyCount: count };
|
|
124
|
+
}
|
|
125
|
+
async clear() {
|
|
126
|
+
if (typeof localStorage === 'undefined')
|
|
127
|
+
return false;
|
|
128
|
+
const keys = await this.list();
|
|
129
|
+
keys.forEach(k => localStorage.removeItem(this.prefix + k));
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.LocalStorageAdapter = LocalStorageAdapter;
|
|
134
|
+
// Browser sessionStorage adapter
|
|
135
|
+
class SessionStorageAdapter extends BaseAdapter {
|
|
136
|
+
prefix;
|
|
137
|
+
constructor(prefix = 'qnce:') { super(); this.prefix = prefix; }
|
|
138
|
+
k(key) { return this.prefix + key; }
|
|
139
|
+
async save(key, data) {
|
|
140
|
+
if (typeof sessionStorage === 'undefined')
|
|
141
|
+
return this.buildResult(false, undefined, 'sessionStorage not available');
|
|
142
|
+
const start = performance.now();
|
|
143
|
+
const serialized = JSON.stringify(data);
|
|
144
|
+
try {
|
|
145
|
+
sessionStorage.setItem(this.k(key), serialized);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
return this.buildResult(false, undefined, e.message);
|
|
149
|
+
}
|
|
150
|
+
return this.buildResult(true, { size: serialized.length, duration: performance.now() - start });
|
|
151
|
+
}
|
|
152
|
+
async load(key) {
|
|
153
|
+
if (typeof sessionStorage === 'undefined')
|
|
154
|
+
return null;
|
|
155
|
+
const raw = sessionStorage.getItem(this.k(key));
|
|
156
|
+
return raw ? safeParse(raw) : null;
|
|
157
|
+
}
|
|
158
|
+
async delete(key) { if (typeof sessionStorage === 'undefined')
|
|
159
|
+
return false; sessionStorage.removeItem(this.k(key)); return true; }
|
|
160
|
+
async list() {
|
|
161
|
+
if (typeof sessionStorage === 'undefined')
|
|
162
|
+
return [];
|
|
163
|
+
const keys = [];
|
|
164
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
165
|
+
const k = sessionStorage.key(i);
|
|
166
|
+
if (k && k.startsWith(this.prefix))
|
|
167
|
+
keys.push(k.substring(this.prefix.length));
|
|
168
|
+
}
|
|
169
|
+
return keys;
|
|
170
|
+
}
|
|
171
|
+
async exists(key) { if (typeof sessionStorage === 'undefined')
|
|
172
|
+
return false; return sessionStorage.getItem(this.k(key)) !== null; }
|
|
173
|
+
async getStats() {
|
|
174
|
+
if (typeof sessionStorage === 'undefined')
|
|
175
|
+
return { totalSize: 0, keyCount: 0 };
|
|
176
|
+
let total = 0;
|
|
177
|
+
let count = 0;
|
|
178
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
179
|
+
const k = sessionStorage.key(i);
|
|
180
|
+
if (k && k.startsWith(this.prefix)) {
|
|
181
|
+
const v = sessionStorage.getItem(k) || '';
|
|
182
|
+
total += v.length;
|
|
183
|
+
count++;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return { totalSize: total, keyCount: count };
|
|
187
|
+
}
|
|
188
|
+
async clear() {
|
|
189
|
+
if (typeof sessionStorage === 'undefined')
|
|
190
|
+
return false;
|
|
191
|
+
const keys = await this.list();
|
|
192
|
+
keys.forEach(k => sessionStorage.removeItem(this.prefix + k));
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.SessionStorageAdapter = SessionStorageAdapter;
|
|
197
|
+
// File system adapter (Node.js only)
|
|
198
|
+
class FileStorageAdapter extends BaseAdapter {
|
|
199
|
+
dir;
|
|
200
|
+
constructor(directory) { super(); this.dir = directory; }
|
|
201
|
+
async ensureDir() {
|
|
202
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
203
|
+
await fs.mkdir(this.dir, { recursive: true });
|
|
204
|
+
}
|
|
205
|
+
pathFor(key) { return `${this.dir}/${key}.json`; }
|
|
206
|
+
async save(key, data) {
|
|
207
|
+
const start = performance.now();
|
|
208
|
+
await this.ensureDir();
|
|
209
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
210
|
+
const serialized = JSON.stringify(data, null, 0);
|
|
211
|
+
await fs.writeFile(this.pathFor(key), serialized, 'utf-8');
|
|
212
|
+
return this.buildResult(true, { size: serialized.length, duration: performance.now() - start });
|
|
213
|
+
}
|
|
214
|
+
async load(key) {
|
|
215
|
+
try {
|
|
216
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
217
|
+
const raw = await fs.readFile(this.pathFor(key), 'utf-8');
|
|
218
|
+
return safeParse(raw);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async delete(key) {
|
|
225
|
+
try {
|
|
226
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
227
|
+
await fs.unlink(this.pathFor(key));
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async list() {
|
|
235
|
+
try {
|
|
236
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
237
|
+
const files = await fs.readdir(this.dir);
|
|
238
|
+
return files.filter(f => f.endsWith('.json')).map(f => f.replace(/\.json$/, ''));
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async exists(key) {
|
|
245
|
+
try {
|
|
246
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
247
|
+
await fs.access(this.pathFor(key));
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async getStats() {
|
|
255
|
+
try {
|
|
256
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
257
|
+
const files = await fs.readdir(this.dir);
|
|
258
|
+
let total = 0;
|
|
259
|
+
let count = 0;
|
|
260
|
+
for (const f of files)
|
|
261
|
+
if (f.endsWith('.json')) {
|
|
262
|
+
const raw = await fs.readFile(`${this.dir}/${f}`, 'utf-8');
|
|
263
|
+
total += raw.length;
|
|
264
|
+
count++;
|
|
265
|
+
}
|
|
266
|
+
return { totalSize: total, keyCount: count };
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return { totalSize: 0, keyCount: 0 };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async clear() {
|
|
273
|
+
try {
|
|
274
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
275
|
+
const files = await fs.readdir(this.dir);
|
|
276
|
+
await Promise.all(files.filter(f => f.endsWith('.json')).map(f => fs.unlink(`${this.dir}/${f}`)));
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
exports.FileStorageAdapter = FileStorageAdapter;
|
|
285
|
+
// IndexedDB adapter (browser) - minimal implementation
|
|
286
|
+
class IndexedDBStorageAdapter extends BaseAdapter {
|
|
287
|
+
dbName;
|
|
288
|
+
storeName = 'qnce_state';
|
|
289
|
+
constructor(databaseName = 'QNCE_DB') { super(); this.dbName = databaseName; }
|
|
290
|
+
async withStore(mode, fn) {
|
|
291
|
+
return new Promise((resolve, reject) => {
|
|
292
|
+
const openReq = indexedDB.open(this.dbName, 1);
|
|
293
|
+
openReq.onupgradeneeded = () => {
|
|
294
|
+
const db = openReq.result;
|
|
295
|
+
if (!db.objectStoreNames.contains(this.storeName))
|
|
296
|
+
db.createObjectStore(this.storeName);
|
|
297
|
+
};
|
|
298
|
+
openReq.onerror = () => reject(openReq.error);
|
|
299
|
+
openReq.onsuccess = () => {
|
|
300
|
+
const db = openReq.result;
|
|
301
|
+
const tx = db.transaction(this.storeName, mode);
|
|
302
|
+
const store = tx.objectStore(this.storeName);
|
|
303
|
+
const result = fn(store);
|
|
304
|
+
tx.oncomplete = () => resolve(result);
|
|
305
|
+
tx.onerror = () => reject(tx.error);
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async save(key, data) {
|
|
310
|
+
if (typeof indexedDB === 'undefined')
|
|
311
|
+
return this.buildResult(false, undefined, 'indexedDB not available');
|
|
312
|
+
const start = performance.now();
|
|
313
|
+
await this.withStore('readwrite', store => { store.put(data, key); });
|
|
314
|
+
return this.buildResult(true, { size: JSON.stringify(data).length, duration: performance.now() - start });
|
|
315
|
+
}
|
|
316
|
+
async load(key) {
|
|
317
|
+
if (typeof indexedDB === 'undefined')
|
|
318
|
+
return null;
|
|
319
|
+
return new Promise((resolve, reject) => {
|
|
320
|
+
this.withStore('readonly', store => {
|
|
321
|
+
const req = store.get(key);
|
|
322
|
+
req.onsuccess = () => resolve(req.result || null);
|
|
323
|
+
req.onerror = () => reject(req.error);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async delete(key) {
|
|
328
|
+
if (typeof indexedDB === 'undefined')
|
|
329
|
+
return false;
|
|
330
|
+
await this.withStore('readwrite', store => { store.delete(key); });
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
async list() {
|
|
334
|
+
if (typeof indexedDB === 'undefined')
|
|
335
|
+
return [];
|
|
336
|
+
return new Promise((resolve, reject) => {
|
|
337
|
+
this.withStore('readonly', store => {
|
|
338
|
+
const keys = [];
|
|
339
|
+
const cursorReq = store.openCursor();
|
|
340
|
+
cursorReq.onsuccess = () => {
|
|
341
|
+
const cursor = cursorReq.result;
|
|
342
|
+
if (cursor) {
|
|
343
|
+
keys.push(cursor.key);
|
|
344
|
+
cursor.continue();
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
resolve(keys);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
cursorReq.onerror = () => reject(cursorReq.error);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
async exists(key) { const val = await this.load(key); return !!val; }
|
|
355
|
+
async getStats() {
|
|
356
|
+
const keys = await this.list();
|
|
357
|
+
let total = 0;
|
|
358
|
+
for (const k of keys) {
|
|
359
|
+
const v = await this.load(k);
|
|
360
|
+
if (v)
|
|
361
|
+
total += JSON.stringify(v).length;
|
|
362
|
+
}
|
|
363
|
+
return { totalSize: total, keyCount: keys.length };
|
|
364
|
+
}
|
|
365
|
+
async clear() {
|
|
366
|
+
if (typeof indexedDB === 'undefined')
|
|
367
|
+
return false;
|
|
368
|
+
await this.withStore('readwrite', store => { store.clear(); });
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.IndexedDBStorageAdapter = IndexedDBStorageAdapter;
|
|
373
|
+
function createStorageAdapter(type, options = {}) {
|
|
374
|
+
switch (type) {
|
|
375
|
+
case 'memory': return new MemoryStorageAdapter();
|
|
376
|
+
case 'localStorage': return new LocalStorageAdapter(options.prefix);
|
|
377
|
+
case 'sessionStorage': return new SessionStorageAdapter(options.prefix);
|
|
378
|
+
case 'file': return new FileStorageAdapter(options.directory || './qnce_saves');
|
|
379
|
+
case 'indexedDB': return new IndexedDBStorageAdapter(options.databaseName);
|
|
380
|
+
default: throw new Error(`Unknown storage adapter type: ${type}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=StorageAdapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageAdapters.js","sourceRoot":"","sources":["../../src/persistence/StorageAdapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://bytesower.dev/qnce/story-data.schema.json",
|
|
4
|
+
"title": "QNCE StoryData",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["initialNodeId", "nodes"],
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"initialNodeId": { "type": "string" },
|
|
10
|
+
"nodes": {
|
|
11
|
+
"type": "array",
|
|
12
|
+
"minItems": 1,
|
|
13
|
+
"items": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["id", "text", "choices"],
|
|
16
|
+
"additionalProperties": false,
|
|
17
|
+
"properties": {
|
|
18
|
+
"id": { "type": "string" },
|
|
19
|
+
"text": { "type": "string" },
|
|
20
|
+
"choices": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"items": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"required": ["text", "nextNodeId"],
|
|
25
|
+
"additionalProperties": false,
|
|
26
|
+
"properties": {
|
|
27
|
+
"text": { "type": "string" },
|
|
28
|
+
"nextNodeId": { "type": "string" },
|
|
29
|
+
"flagEffects": { "type": ["object", "null"] },
|
|
30
|
+
"flagRequirements": { "type": ["object", "null"] },
|
|
31
|
+
"timeRequirements": { "type": ["object", "null"] },
|
|
32
|
+
"inventoryRequirements": { "type": ["object", "null"] },
|
|
33
|
+
"enabled": { "type": ["boolean", "null"] },
|
|
34
|
+
"condition": { "type": ["string", "null"] }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"meta": {
|
|
39
|
+
"type": ["object", "null"],
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"properties": {
|
|
42
|
+
"tags": {
|
|
43
|
+
"type": ["array", "null"],
|
|
44
|
+
"items": { "type": "string" }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ErrorObject } from 'ajv';
|
|
2
|
+
import type { StoryData } from '../engine/core';
|
|
3
|
+
export interface SchemaValidation {
|
|
4
|
+
valid: boolean;
|
|
5
|
+
errors?: ErrorObject[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateStoryData(data: StoryData): SchemaValidation;
|
|
8
|
+
//# sourceMappingURL=validateStoryData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStoryData.d.ts","sourceRoot":"","sources":["../../src/schemas/validateStoryData.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAGnE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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.validateStoryData = validateStoryData;
|
|
7
|
+
// JSON Schema validation for QNCE StoryData using AJV
|
|
8
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
9
|
+
const story_data_schema_json_1 = __importDefault(require("./story-data.schema.json"));
|
|
10
|
+
const ajv = new ajv_1.default({ allErrors: true });
|
|
11
|
+
const validateFn = ajv.compile(story_data_schema_json_1.default);
|
|
12
|
+
function validateStoryData(data) {
|
|
13
|
+
const valid = validateFn(data);
|
|
14
|
+
return { valid, errors: valid ? undefined : (validateFn.errors || undefined) };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=validateStoryData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStoryData.js","sourceRoot":"","sources":["../../src/schemas/validateStoryData.ts"],"names":[],"mappings":";;;;;AAaA,8CAGC;AAhBD,sDAAsD;AACtD,8CAAuC;AACvC,sFAA8C;AAG9C,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAS,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,gCAAa,CAAC,CAAC;AAO9C,SAAgB,iBAAiB,CAAC,IAAe;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAY,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC;AACjF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qnce-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Core QNCE (Quantum Narrative Convergence Engine) - Framework agnostic narrative engine with performance optimization",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"qnce-audit": "dist/cli/audit.js",
|
|
9
9
|
"qnce-init": "dist/cli/init.js",
|
|
10
10
|
"qnce-perf": "dist/cli/perf.js",
|
|
11
|
-
"qnce-play": "dist/cli/play.js"
|
|
11
|
+
"qnce-play": "dist/cli/play.js",
|
|
12
|
+
"qnce-import": "dist/cli/import.js"
|
|
12
13
|
},
|
|
13
14
|
"scripts": {
|
|
14
15
|
"build": "tsc",
|
|
@@ -63,6 +64,9 @@
|
|
|
63
64
|
"ts-jest": "^29.4.0",
|
|
64
65
|
"typescript": "~5.8.3"
|
|
65
66
|
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"ajv": "^8.12.0"
|
|
69
|
+
},
|
|
66
70
|
"peerDependencies": {
|
|
67
71
|
"react": ">=16.8.0"
|
|
68
72
|
},
|