@akanjs/signal 0.0.97 → 0.0.99
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/index.cjs +17 -0
- package/index.js +1 -17
- package/package.json +5 -5
- package/src/baseFetch.cjs +34 -0
- package/src/baseFetch.js +5 -24
- package/src/{client.mjs → client.cjs} +40 -21
- package/src/client.js +21 -40
- package/src/doc.cjs +101 -0
- package/src/doc.js +23 -42
- package/src/{gql.mjs → gql.cjs} +141 -144
- package/src/gql.js +144 -141
- package/src/immerify.cjs +35 -0
- package/src/immerify.js +7 -26
- package/src/index.cjs +30 -0
- package/src/index.js +9 -29
- package/src/{signalDecorators.mjs → signalDecorators.cjs} +95 -87
- package/src/signalDecorators.js +87 -95
- package/index.mjs +0 -1
- package/src/baseFetch.mjs +0 -15
- package/src/doc.mjs +0 -82
- package/src/immerify.mjs +0 -16
- package/src/index.mjs +0 -10
package/src/gql.js
CHANGED
|
@@ -1,46 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
getGqlStr: () => getGqlStr,
|
|
29
|
-
gqlOf: () => gqlOf,
|
|
30
|
-
makeCrystalize: () => makeCrystalize,
|
|
31
|
-
makeDefault: () => makeDefault,
|
|
32
|
-
makeFetch: () => makeFetch,
|
|
33
|
-
makeFragment: () => makeFragment,
|
|
34
|
-
makePurify: () => makePurify,
|
|
35
|
-
scalarUtilOf: () => scalarUtilOf,
|
|
36
|
-
serializeArg: () => serializeArg
|
|
37
|
-
});
|
|
38
|
-
module.exports = __toCommonJS(gql_exports);
|
|
39
|
-
var import_base = require("@akanjs/base");
|
|
40
|
-
var import_common = require("@akanjs/common");
|
|
41
|
-
var import_constant = require("@akanjs/constant");
|
|
42
|
-
var import__ = require(".");
|
|
43
|
-
var import_signalDecorators = require("./signalDecorators");
|
|
1
|
+
import {
|
|
2
|
+
applyFnToArrayObjects,
|
|
3
|
+
DataList,
|
|
4
|
+
dayjs,
|
|
5
|
+
Enum,
|
|
6
|
+
Float,
|
|
7
|
+
getNonArrayModel,
|
|
8
|
+
ID,
|
|
9
|
+
Int,
|
|
10
|
+
isGqlScalar,
|
|
11
|
+
JSON as GqlJSON,
|
|
12
|
+
scalarDefaultMap
|
|
13
|
+
} from "@akanjs/base";
|
|
14
|
+
import { capitalize, Logger, lowerlize } from "@akanjs/common";
|
|
15
|
+
import {
|
|
16
|
+
getClassMeta,
|
|
17
|
+
getFieldMetaMap,
|
|
18
|
+
getFieldMetas,
|
|
19
|
+
getGqlTypeStr,
|
|
20
|
+
getLightModelRef
|
|
21
|
+
} from "@akanjs/constant";
|
|
22
|
+
import { client, immerify } from ".";
|
|
23
|
+
import {
|
|
24
|
+
getArgMetas,
|
|
25
|
+
getGqlMetas,
|
|
26
|
+
getSigMeta
|
|
27
|
+
} from "./signalDecorators";
|
|
44
28
|
function graphql(literals, ...args) {
|
|
45
29
|
if (typeof literals === "string")
|
|
46
30
|
literals = [literals];
|
|
@@ -65,12 +49,12 @@ class DefaultStorage {
|
|
|
65
49
|
class CrystalizeStorage {
|
|
66
50
|
}
|
|
67
51
|
const scalarUtilOf = (name, target) => {
|
|
68
|
-
const refName =
|
|
69
|
-
const [fieldName, className] = [
|
|
52
|
+
const refName = getClassMeta(target).refName;
|
|
53
|
+
const [fieldName, className] = [lowerlize(refName), capitalize(refName)];
|
|
70
54
|
const graphQL = {
|
|
71
55
|
refName,
|
|
72
56
|
[className]: target,
|
|
73
|
-
[`default${className}`]:
|
|
57
|
+
[`default${className}`]: immerify(target, Object.assign(new target(), makeDefault(target))),
|
|
74
58
|
[`purify${className}`]: makePurify(target),
|
|
75
59
|
[`crystalize${className}`]: makeCrystalize(target),
|
|
76
60
|
[`${fieldName}Fragment`]: makeFragment(target)
|
|
@@ -88,8 +72,8 @@ const setGqlOnStorage = (refName, modelGql) => {
|
|
|
88
72
|
};
|
|
89
73
|
const gqlOf = (constant, sigRef, option = {}) => {
|
|
90
74
|
const refName = constant.refName;
|
|
91
|
-
const [fieldName, className] = [
|
|
92
|
-
const sigMeta =
|
|
75
|
+
const [fieldName, className] = [lowerlize(refName), capitalize(refName)];
|
|
76
|
+
const sigMeta = getSigMeta(sigRef);
|
|
93
77
|
const names = {
|
|
94
78
|
refName,
|
|
95
79
|
model: fieldName,
|
|
@@ -136,7 +120,7 @@ const gqlOf = (constant, sigRef, option = {}) => {
|
|
|
136
120
|
[names.crystalizeModel]: makeCrystalize(constant.Full, option),
|
|
137
121
|
[names.lightCrystalizeModel]: makeCrystalize(constant.Light, option),
|
|
138
122
|
[names.crystalizeModelInsight]: makeCrystalize(constant.Insight, option),
|
|
139
|
-
[names.defaultModel]:
|
|
123
|
+
[names.defaultModel]: immerify(
|
|
140
124
|
constant.Full,
|
|
141
125
|
Object.assign(new constant.Full(), makeDefault(constant.Full, option))
|
|
142
126
|
),
|
|
@@ -145,7 +129,7 @@ const gqlOf = (constant, sigRef, option = {}) => {
|
|
|
145
129
|
makeDefault(constant.Insight, option)
|
|
146
130
|
)
|
|
147
131
|
};
|
|
148
|
-
const gql = Object.assign(option.overwrite ?? { client
|
|
132
|
+
const gql = Object.assign(option.overwrite ?? { client }, fetchOf(sigRef));
|
|
149
133
|
const util = {
|
|
150
134
|
[names.addModelFiles]: async (files, id, option2) => {
|
|
151
135
|
const fileGql = getGqlOnStorage("file");
|
|
@@ -253,7 +237,7 @@ const gqlOf = (constant, sigRef, option = {}) => {
|
|
|
253
237
|
const modelInit = await getInitFn(...args);
|
|
254
238
|
const modelObjList = modelInit[names.modelObjList];
|
|
255
239
|
const modelObjInsight = modelInit[names.modelObjInsight];
|
|
256
|
-
const modelList = new
|
|
240
|
+
const modelList = new DataList(
|
|
257
241
|
modelObjList.map((modelObj) => base[names.lightCrystalizeModel](modelObj))
|
|
258
242
|
);
|
|
259
243
|
const modelInsight = base[names.crystalizeModelInsight](modelObjInsight);
|
|
@@ -289,13 +273,13 @@ const setPredefinedDefault = (refName, defaultData) => {
|
|
|
289
273
|
Reflect.defineMetadata(refName, defaultData, DefaultStorage.prototype);
|
|
290
274
|
};
|
|
291
275
|
const makeDefault = (target, option = {}) => {
|
|
292
|
-
const classMeta =
|
|
276
|
+
const classMeta = getClassMeta(target);
|
|
293
277
|
const predefinedDefault = getPredefinedDefault(classMeta.refName);
|
|
294
278
|
if (predefinedDefault && !option.overwrite)
|
|
295
279
|
return predefinedDefault;
|
|
296
280
|
if (option.isChild && classMeta.type !== "scalar")
|
|
297
281
|
return null;
|
|
298
|
-
const metadatas =
|
|
282
|
+
const metadatas = getFieldMetas(target);
|
|
299
283
|
const result = {};
|
|
300
284
|
for (const metadata of metadatas) {
|
|
301
285
|
if (metadata.fieldType === "hidden")
|
|
@@ -303,7 +287,7 @@ const makeDefault = (target, option = {}) => {
|
|
|
303
287
|
else if (metadata.default) {
|
|
304
288
|
if (typeof metadata.default === "function")
|
|
305
289
|
result[metadata.key] = metadata.default();
|
|
306
|
-
else if (metadata.default instanceof
|
|
290
|
+
else if (metadata.default instanceof Enum)
|
|
307
291
|
result[metadata.key] = [...metadata.default.values];
|
|
308
292
|
else
|
|
309
293
|
result[metadata.key] = metadata.default;
|
|
@@ -314,7 +298,7 @@ const makeDefault = (target, option = {}) => {
|
|
|
314
298
|
else if (metadata.isClass)
|
|
315
299
|
result[metadata.key] = metadata.isScalar ? makeDefault(metadata.modelRef) : null;
|
|
316
300
|
else
|
|
317
|
-
result[metadata.key] =
|
|
301
|
+
result[metadata.key] = scalarDefaultMap.get(metadata.modelRef);
|
|
318
302
|
}
|
|
319
303
|
setPredefinedDefault(classMeta.refName, result);
|
|
320
304
|
return result;
|
|
@@ -370,16 +354,16 @@ const mutate = async (fetchClient, mutation, variables = {}, option = {}) => {
|
|
|
370
354
|
return data;
|
|
371
355
|
};
|
|
372
356
|
const scalarPurifyMap = /* @__PURE__ */ new Map([
|
|
373
|
-
[Date, (value) =>
|
|
357
|
+
[Date, (value) => dayjs(value).toDate()],
|
|
374
358
|
[String, (value) => value],
|
|
375
|
-
[
|
|
359
|
+
[ID, (value) => value],
|
|
376
360
|
[Boolean, (value) => value],
|
|
377
|
-
[
|
|
378
|
-
[
|
|
379
|
-
[
|
|
361
|
+
[Int, (value) => value],
|
|
362
|
+
[Float, (value) => value],
|
|
363
|
+
[GqlJSON, (value) => value]
|
|
380
364
|
]);
|
|
381
365
|
const getPurifyFn = (modelRef) => {
|
|
382
|
-
const [valueRef] =
|
|
366
|
+
const [valueRef] = getNonArrayModel(modelRef);
|
|
383
367
|
return scalarPurifyMap.get(valueRef) ?? ((value) => value);
|
|
384
368
|
};
|
|
385
369
|
const purify = (metadata, value, self) => {
|
|
@@ -399,12 +383,12 @@ const purify = (metadata, value, self) => {
|
|
|
399
383
|
if (metadata.isMap && metadata.of) {
|
|
400
384
|
const purifyFn2 = getPurifyFn(metadata.of);
|
|
401
385
|
return Object.fromEntries(
|
|
402
|
-
[...value.entries()].map(([key, val]) => [key,
|
|
386
|
+
[...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, purifyFn2)])
|
|
403
387
|
);
|
|
404
388
|
}
|
|
405
389
|
if (metadata.isClass)
|
|
406
390
|
return makePurify(metadata.modelRef)(value, true);
|
|
407
|
-
if (metadata.name === "Date" &&
|
|
391
|
+
if (metadata.name === "Date" && dayjs(value).isBefore(dayjs(/* @__PURE__ */ new Date("0000"))))
|
|
408
392
|
throw new Error(`Invalid Date Value (Default) in ${metadata.key} for value ${value}`);
|
|
409
393
|
if (["String", "ID"].includes(metadata.name) && (value === "" || !value))
|
|
410
394
|
throw new Error(`Invalid String Value (Default) in ${metadata.key} for value ${value}`);
|
|
@@ -423,11 +407,11 @@ const setPredefinedPurifyFn = (refName, purify2) => {
|
|
|
423
407
|
Reflect.defineMetadata(refName, purify2, PurifyStorage.prototype);
|
|
424
408
|
};
|
|
425
409
|
const makePurify = (target, option = {}) => {
|
|
426
|
-
const classMeta =
|
|
410
|
+
const classMeta = getClassMeta(target);
|
|
427
411
|
const purifyFn = getPredefinedPurifyFn(classMeta.refName);
|
|
428
412
|
if (purifyFn && !option.overwrite)
|
|
429
413
|
return purifyFn;
|
|
430
|
-
const metadatas =
|
|
414
|
+
const metadatas = getFieldMetas(target);
|
|
431
415
|
const fn = (self, isChild) => {
|
|
432
416
|
try {
|
|
433
417
|
if (isChild && classMeta.type !== "scalar") {
|
|
@@ -445,7 +429,7 @@ const makePurify = (target, option = {}) => {
|
|
|
445
429
|
} catch (err) {
|
|
446
430
|
if (isChild)
|
|
447
431
|
throw new Error(err);
|
|
448
|
-
|
|
432
|
+
Logger.debug(err);
|
|
449
433
|
return null;
|
|
450
434
|
}
|
|
451
435
|
};
|
|
@@ -453,13 +437,13 @@ const makePurify = (target, option = {}) => {
|
|
|
453
437
|
return fn;
|
|
454
438
|
};
|
|
455
439
|
const scalarCrystalizeMap = /* @__PURE__ */ new Map([
|
|
456
|
-
[Date, (value) =>
|
|
440
|
+
[Date, (value) => dayjs(value)],
|
|
457
441
|
[String, (value) => value],
|
|
458
|
-
[
|
|
442
|
+
[ID, (value) => value],
|
|
459
443
|
[Boolean, (value) => value],
|
|
460
|
-
[
|
|
461
|
-
[
|
|
462
|
-
[
|
|
444
|
+
[Int, (value) => value],
|
|
445
|
+
[Float, (value) => value],
|
|
446
|
+
[GqlJSON, (value) => value]
|
|
463
447
|
]);
|
|
464
448
|
const crystalize = (metadata, value) => {
|
|
465
449
|
if (value === void 0 || value === null)
|
|
@@ -467,16 +451,16 @@ const crystalize = (metadata, value) => {
|
|
|
467
451
|
if (metadata.isArray && Array.isArray(value))
|
|
468
452
|
return value.map((v) => crystalize({ ...metadata, isArray: false }, v));
|
|
469
453
|
if (metadata.isMap) {
|
|
470
|
-
const [valueRef] =
|
|
454
|
+
const [valueRef] = getNonArrayModel(metadata.of);
|
|
471
455
|
const crystalizeValue = scalarCrystalizeMap.get(valueRef) ?? ((value2) => value2);
|
|
472
456
|
return new Map(
|
|
473
|
-
Object.entries(value).map(([key, val]) => [key,
|
|
457
|
+
Object.entries(value).map(([key, val]) => [key, applyFnToArrayObjects(val, crystalizeValue)])
|
|
474
458
|
);
|
|
475
459
|
}
|
|
476
460
|
if (metadata.isClass)
|
|
477
461
|
return makeCrystalize(metadata.modelRef)(value, true);
|
|
478
462
|
if (metadata.name === "Date")
|
|
479
|
-
return
|
|
463
|
+
return dayjs(value);
|
|
480
464
|
return (scalarCrystalizeMap.get(metadata.modelRef) ?? ((value2) => value2))(value);
|
|
481
465
|
};
|
|
482
466
|
const getPredefinedCrystalizeFn = (refName) => {
|
|
@@ -487,11 +471,11 @@ const setPredefinedCrystalizeFn = (refName, crystalize2) => {
|
|
|
487
471
|
Reflect.defineMetadata(refName, crystalize2, CrystalizeStorage.prototype);
|
|
488
472
|
};
|
|
489
473
|
const makeCrystalize = (target, option = {}) => {
|
|
490
|
-
const classMeta =
|
|
474
|
+
const classMeta = getClassMeta(target);
|
|
491
475
|
const crystalizeFn = getPredefinedCrystalizeFn(classMeta.refName);
|
|
492
476
|
if (crystalizeFn && !option.overwrite && !option.partial?.length)
|
|
493
477
|
return crystalizeFn;
|
|
494
|
-
const fieldMetaMap =
|
|
478
|
+
const fieldMetaMap = getFieldMetaMap(target);
|
|
495
479
|
const fieldKeys = option.partial?.length ? classMeta.type === "scalar" ? option.partial : ["id", ...option.partial, "updatedAt"] : [...fieldMetaMap.keys()];
|
|
496
480
|
const metadatas = fieldKeys.map((key) => fieldMetaMap.get(key));
|
|
497
481
|
const fn = (self, isChild) => {
|
|
@@ -514,16 +498,16 @@ const makeCrystalize = (target, option = {}) => {
|
|
|
514
498
|
return fn;
|
|
515
499
|
};
|
|
516
500
|
const fragmentize = (target, fragMap = /* @__PURE__ */ new Map(), partial) => {
|
|
517
|
-
const classMeta =
|
|
518
|
-
const metadatas =
|
|
501
|
+
const classMeta = getClassMeta(target);
|
|
502
|
+
const metadatas = getFieldMetas(target);
|
|
519
503
|
const selectKeys = partial ? ["id", ...partial, "updatedAt"] : metadatas.map((metadata) => metadata.key);
|
|
520
504
|
const selectKeySet = new Set(selectKeys);
|
|
521
|
-
const fragment = `fragment ${
|
|
505
|
+
const fragment = `fragment ${lowerlize(classMeta.refName)}Fragment on ${capitalize(
|
|
522
506
|
classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName
|
|
523
507
|
)} {
|
|
524
508
|
` + metadatas.filter((metadata) => metadata.fieldType !== "hidden" && selectKeySet.has(metadata.key)).map((metadata) => {
|
|
525
509
|
return metadata.isClass ? ` ${metadata.key} {
|
|
526
|
-
...${
|
|
510
|
+
...${lowerlize(metadata.name)}Fragment
|
|
527
511
|
}` : ` ${metadata.key}`;
|
|
528
512
|
}).join(`
|
|
529
513
|
`) + `
|
|
@@ -540,7 +524,7 @@ const setPredefinedFragment = (refName, fragment) => {
|
|
|
540
524
|
Reflect.defineMetadata(refName, fragment, FragmentStorage.prototype);
|
|
541
525
|
};
|
|
542
526
|
const makeFragment = (target, option = {}) => {
|
|
543
|
-
const classMeta =
|
|
527
|
+
const classMeta = getClassMeta(target);
|
|
544
528
|
const fragment = getPredefinedFragment(classMeta.refName);
|
|
545
529
|
if (fragment && !option.overwrite && !option.excludeSelf && !option.partial?.length)
|
|
546
530
|
return fragment;
|
|
@@ -553,25 +537,25 @@ const makeFragment = (target, option = {}) => {
|
|
|
553
537
|
return gqlStr;
|
|
554
538
|
};
|
|
555
539
|
const getGqlStr = (modelRef, gqlMeta, argMetas, returnRef, partial) => {
|
|
556
|
-
const isScalar =
|
|
540
|
+
const isScalar = isGqlScalar(modelRef);
|
|
557
541
|
const argStr = makeArgStr(argMetas);
|
|
558
542
|
const argAssignStr = makeArgAssignStr(argMetas);
|
|
559
543
|
const returnStr = makeReturnStr(returnRef, partial);
|
|
560
544
|
const gqlStr = `${isScalar ? "" : makeFragment(returnRef, { excludeSelf: !!partial?.length, partial })}
|
|
561
|
-
${
|
|
545
|
+
${lowerlize(gqlMeta.type) + " " + gqlMeta.key + argStr}{
|
|
562
546
|
${gqlMeta.key}${argAssignStr}${returnStr}
|
|
563
547
|
}
|
|
564
548
|
`;
|
|
565
549
|
return gqlStr;
|
|
566
550
|
};
|
|
567
551
|
const scalarSerializeMap = /* @__PURE__ */ new Map([
|
|
568
|
-
[Date, (value) =>
|
|
552
|
+
[Date, (value) => dayjs(value).toDate()],
|
|
569
553
|
[String, (value) => value],
|
|
570
|
-
[
|
|
554
|
+
[ID, (value) => value],
|
|
571
555
|
[Boolean, (value) => value],
|
|
572
|
-
[
|
|
573
|
-
[
|
|
574
|
-
[
|
|
556
|
+
[Int, (value) => value],
|
|
557
|
+
[Float, (value) => value],
|
|
558
|
+
[GqlJSON, (value) => value]
|
|
575
559
|
]);
|
|
576
560
|
const getSerializeFn = (inputRef) => {
|
|
577
561
|
const serializeFn = scalarSerializeMap.get(inputRef);
|
|
@@ -584,28 +568,28 @@ const serializeInput = (value, inputRef, arrDepth) => {
|
|
|
584
568
|
if (arrDepth && Array.isArray(value))
|
|
585
569
|
return value.map((v) => serializeInput(v, inputRef, arrDepth - 1));
|
|
586
570
|
else if (inputRef.prototype === Map.prototype) {
|
|
587
|
-
const [valueRef] =
|
|
571
|
+
const [valueRef] = getNonArrayModel(inputRef);
|
|
588
572
|
const serializeFn = getSerializeFn(valueRef);
|
|
589
573
|
return Object.fromEntries(
|
|
590
|
-
[...value.entries()].map(([key, val]) => [key,
|
|
574
|
+
[...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, serializeFn)])
|
|
591
575
|
);
|
|
592
|
-
} else if (
|
|
576
|
+
} else if (isGqlScalar(inputRef)) {
|
|
593
577
|
const serializeFn = getSerializeFn(inputRef);
|
|
594
578
|
return serializeFn(value);
|
|
595
579
|
}
|
|
596
|
-
const classMeta =
|
|
580
|
+
const classMeta = getClassMeta(inputRef);
|
|
597
581
|
if (classMeta.type !== "scalar")
|
|
598
582
|
return value;
|
|
599
583
|
else
|
|
600
584
|
return Object.fromEntries(
|
|
601
|
-
|
|
585
|
+
getFieldMetas(inputRef).map((fieldMeta) => [
|
|
602
586
|
fieldMeta.key,
|
|
603
587
|
serializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
|
|
604
588
|
])
|
|
605
589
|
);
|
|
606
590
|
};
|
|
607
591
|
const serializeArg = (argMeta, value) => {
|
|
608
|
-
const [returnRef, arrDepth] =
|
|
592
|
+
const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
|
|
609
593
|
if (argMeta.argsOption.nullable && (value === null || value === void 0))
|
|
610
594
|
return null;
|
|
611
595
|
else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
|
|
@@ -613,13 +597,13 @@ const serializeArg = (argMeta, value) => {
|
|
|
613
597
|
return serializeInput(value, returnRef, arrDepth);
|
|
614
598
|
};
|
|
615
599
|
const scalarDeserializeMap = /* @__PURE__ */ new Map([
|
|
616
|
-
[Date, (value) =>
|
|
600
|
+
[Date, (value) => dayjs(value)],
|
|
617
601
|
[String, (value) => value],
|
|
618
|
-
[
|
|
602
|
+
[ID, (value) => value],
|
|
619
603
|
[Boolean, (value) => value],
|
|
620
|
-
[
|
|
621
|
-
[
|
|
622
|
-
[
|
|
604
|
+
[Int, (value) => value],
|
|
605
|
+
[Float, (value) => value],
|
|
606
|
+
[GqlJSON, (value) => value]
|
|
623
607
|
]);
|
|
624
608
|
const getDeserializeFn = (inputRef) => {
|
|
625
609
|
const deserializeFn = scalarDeserializeMap.get(inputRef);
|
|
@@ -631,28 +615,28 @@ const deserializeInput = (value, inputRef, arrDepth) => {
|
|
|
631
615
|
if (arrDepth && Array.isArray(value))
|
|
632
616
|
return value.map((v) => deserializeInput(v, inputRef, arrDepth - 1));
|
|
633
617
|
else if (inputRef.prototype === Map.prototype) {
|
|
634
|
-
const [valueRef] =
|
|
618
|
+
const [valueRef] = getNonArrayModel(inputRef);
|
|
635
619
|
const deserializeFn = getDeserializeFn(valueRef);
|
|
636
620
|
return Object.fromEntries(
|
|
637
|
-
[...value.entries()].map(([key, val]) => [key,
|
|
621
|
+
[...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, deserializeFn)])
|
|
638
622
|
);
|
|
639
|
-
} else if (
|
|
623
|
+
} else if (isGqlScalar(inputRef)) {
|
|
640
624
|
const deserializeFn = getDeserializeFn(inputRef);
|
|
641
625
|
return deserializeFn(value);
|
|
642
626
|
}
|
|
643
|
-
const classMeta =
|
|
627
|
+
const classMeta = getClassMeta(inputRef);
|
|
644
628
|
if (classMeta.type !== "scalar")
|
|
645
629
|
return value;
|
|
646
630
|
else
|
|
647
631
|
return Object.fromEntries(
|
|
648
|
-
|
|
632
|
+
getFieldMetas(inputRef).map((fieldMeta) => [
|
|
649
633
|
fieldMeta.key,
|
|
650
634
|
deserializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
|
|
651
635
|
])
|
|
652
636
|
);
|
|
653
637
|
};
|
|
654
638
|
const deserializeArg = (argMeta, value) => {
|
|
655
|
-
const [returnRef, arrDepth] =
|
|
639
|
+
const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
|
|
656
640
|
if (argMeta.argsOption.nullable && (value === null || value === void 0))
|
|
657
641
|
return null;
|
|
658
642
|
else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
|
|
@@ -661,16 +645,16 @@ const deserializeArg = (argMeta, value) => {
|
|
|
661
645
|
};
|
|
662
646
|
const fetchOf = (sigRef) => {
|
|
663
647
|
const gqls = {};
|
|
664
|
-
const gqlMetas =
|
|
648
|
+
const gqlMetas = getGqlMetas(sigRef);
|
|
665
649
|
gqlMetas.filter((gqlMeta) => !gqlMeta.signalOption.default).forEach((gqlMeta) => {
|
|
666
650
|
if (gqlMeta.type === "Message") {
|
|
667
|
-
const [returnRef, arrDepth] =
|
|
668
|
-
const [argMetas] =
|
|
669
|
-
const isScalar =
|
|
651
|
+
const [returnRef, arrDepth] = getNonArrayModel(gqlMeta.returns());
|
|
652
|
+
const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
|
|
653
|
+
const isScalar = isGqlScalar(returnRef);
|
|
670
654
|
const emitEvent = function(...args) {
|
|
671
655
|
const fetchPolicy = args[argMetas.length] ?? { crystalize: true };
|
|
672
656
|
if (!this.client.io && !fetchPolicy.url) {
|
|
673
|
-
|
|
657
|
+
Logger.warn(`${gqlMeta.key} emit suppressed - socket is not connected`);
|
|
674
658
|
return;
|
|
675
659
|
}
|
|
676
660
|
const message = Object.fromEntries(
|
|
@@ -682,13 +666,13 @@ const fetchOf = (sigRef) => {
|
|
|
682
666
|
const uri = fetchPolicy.url ?? "udpout:localhost:4000";
|
|
683
667
|
const [host, port] = uri.split(":").slice(1);
|
|
684
668
|
this.client.udp.send(JSON.stringify(message), parseInt(port), host);
|
|
685
|
-
|
|
669
|
+
Logger.debug(`udp emit: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
686
670
|
return;
|
|
687
671
|
} else {
|
|
688
672
|
const io = this.client.getIo(fetchPolicy.url);
|
|
689
673
|
void this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
|
|
690
674
|
io.emit(gqlMeta.key, message);
|
|
691
|
-
|
|
675
|
+
Logger.debug(`socket emit: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
692
676
|
});
|
|
693
677
|
}
|
|
694
678
|
};
|
|
@@ -696,7 +680,7 @@ const fetchOf = (sigRef) => {
|
|
|
696
680
|
const crystalize2 = (data) => {
|
|
697
681
|
if (isScalar) {
|
|
698
682
|
if (returnRef.prototype === Date.prototype)
|
|
699
|
-
return
|
|
683
|
+
return dayjs(data);
|
|
700
684
|
else
|
|
701
685
|
return data;
|
|
702
686
|
} else if (Array.isArray(data))
|
|
@@ -705,32 +689,32 @@ const fetchOf = (sigRef) => {
|
|
|
705
689
|
return makeCrystalize(returnRef)(data);
|
|
706
690
|
};
|
|
707
691
|
const handle = (data) => {
|
|
708
|
-
|
|
692
|
+
Logger.debug(`socket listened: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
709
693
|
handleEvent(crystalize2(data));
|
|
710
694
|
};
|
|
711
695
|
const io = this.client.getIo(fetchPolicy.url);
|
|
712
696
|
this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
|
|
713
697
|
io.removeListener(gqlMeta.key, handle);
|
|
714
698
|
io.on(gqlMeta.key, handle);
|
|
715
|
-
|
|
699
|
+
Logger.debug(`socket listen start: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
716
700
|
});
|
|
717
701
|
return async () => {
|
|
718
702
|
await this.client.waitUntilWebSocketConnected(fetchPolicy.url);
|
|
719
|
-
|
|
703
|
+
Logger.debug(`socket listen end: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
720
704
|
io.removeListener(gqlMeta.key, handle);
|
|
721
705
|
};
|
|
722
706
|
};
|
|
723
707
|
gqls[gqlMeta.key] = emitEvent;
|
|
724
|
-
gqls[`listen${
|
|
708
|
+
gqls[`listen${capitalize(gqlMeta.key)}`] = listenEvent;
|
|
725
709
|
} else if (gqlMeta.type === "Pubsub") {
|
|
726
|
-
const [returnRef] =
|
|
727
|
-
const [argMetas] =
|
|
728
|
-
const isScalar =
|
|
710
|
+
const [returnRef] = getNonArrayModel(gqlMeta.returns());
|
|
711
|
+
const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
|
|
712
|
+
const isScalar = isGqlScalar(returnRef);
|
|
729
713
|
const makeRoomId = (gqlKey, argValues) => `${gqlKey}-${argValues.join("-")}`;
|
|
730
714
|
const crystalize2 = (data) => {
|
|
731
715
|
if (isScalar) {
|
|
732
716
|
if (returnRef.prototype === Date.prototype)
|
|
733
|
-
return
|
|
717
|
+
return dayjs(data);
|
|
734
718
|
else
|
|
735
719
|
return data;
|
|
736
720
|
} else if (Array.isArray(data))
|
|
@@ -755,26 +739,26 @@ const fetchOf = (sigRef) => {
|
|
|
755
739
|
);
|
|
756
740
|
const io = this.client.getIo(fetchPolicy.url);
|
|
757
741
|
void this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
|
|
758
|
-
|
|
742
|
+
Logger.debug(`socket subscribe start: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
759
743
|
io.subscribe({ key: gqlMeta.key, roomId, message, handleEvent });
|
|
760
744
|
});
|
|
761
745
|
return async () => {
|
|
762
746
|
//! 앱에서 다른 앱 넘어갈 때 언마운트 되버리면서 subscribe가 끊기는 일이 있음.
|
|
763
747
|
await this.client.waitUntilWebSocketConnected(fetchPolicy.url);
|
|
764
|
-
|
|
748
|
+
Logger.debug(`socket unsubscribe: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
765
749
|
io.unsubscribe(roomId, handleEvent);
|
|
766
750
|
};
|
|
767
751
|
};
|
|
768
|
-
gqls[`subscribe${
|
|
752
|
+
gqls[`subscribe${capitalize(gqlMeta.key)}`] = subscribeEvent;
|
|
769
753
|
} else if (gqlMeta.type === "Query" || gqlMeta.type === "Mutation") {
|
|
770
754
|
const name = gqlMeta.signalOption.name ?? gqlMeta.key;
|
|
771
755
|
const makeReq = ({ resolve }) => async function(...args) {
|
|
772
|
-
|
|
756
|
+
Logger.debug(`fetch: ${gqlMeta.key} start: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
|
773
757
|
const now = Date.now();
|
|
774
|
-
const [argMetas] =
|
|
775
|
-
const [modelRef, arrDepth] =
|
|
776
|
-
const isScalar =
|
|
777
|
-
const returnRef = isScalar || !arrDepth ? modelRef :
|
|
758
|
+
const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
|
|
759
|
+
const [modelRef, arrDepth] = getNonArrayModel(gqlMeta.returns());
|
|
760
|
+
const isScalar = isGqlScalar(modelRef);
|
|
761
|
+
const returnRef = isScalar || !arrDepth ? modelRef : getLightModelRef(modelRef);
|
|
778
762
|
const fetchPolicy = args[argMetas.length] ?? { crystalize: true };
|
|
779
763
|
const partial = fetchPolicy.partial ?? gqlMeta.signalOption.partial;
|
|
780
764
|
const crystalize2 = (data) => {
|
|
@@ -782,7 +766,7 @@ const fetchOf = (sigRef) => {
|
|
|
782
766
|
return data;
|
|
783
767
|
if (isScalar) {
|
|
784
768
|
if (returnRef.prototype === Date.prototype)
|
|
785
|
-
return
|
|
769
|
+
return dayjs(data);
|
|
786
770
|
else
|
|
787
771
|
return data;
|
|
788
772
|
} else if (Array.isArray(data))
|
|
@@ -800,12 +784,12 @@ const fetchOf = (sigRef) => {
|
|
|
800
784
|
fetchPolicy
|
|
801
785
|
))[name];
|
|
802
786
|
const data = resolve ? crystalize2(res) : res;
|
|
803
|
-
|
|
804
|
-
`fetch: ${gqlMeta.key} end: ${
|
|
787
|
+
Logger.debug(
|
|
788
|
+
`fetch: ${gqlMeta.key} end: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")} ${Date.now() - now}ms`
|
|
805
789
|
);
|
|
806
790
|
return data;
|
|
807
791
|
} catch (e) {
|
|
808
|
-
|
|
792
|
+
Logger.error(`fetch: ${gqlMeta.key} error: ${e}`);
|
|
809
793
|
throw e;
|
|
810
794
|
}
|
|
811
795
|
};
|
|
@@ -820,9 +804,9 @@ const makeFetch = (fetch1, fetch2, fetch3, fetch4, fetch5, fetch6, fetch7, fetch
|
|
|
820
804
|
};
|
|
821
805
|
const makeArgStr = (argMetas) => {
|
|
822
806
|
return argMetas.length ? `(${argMetas.map((argMeta) => {
|
|
823
|
-
const [argRef, arrDepth] =
|
|
824
|
-
const argRefType =
|
|
825
|
-
const gqlTypeStr = "[".repeat(arrDepth) + (
|
|
807
|
+
const [argRef, arrDepth] = getNonArrayModel(argMeta.returns());
|
|
808
|
+
const argRefType = isGqlScalar(argRef) ? "gqlScalar" : getClassMeta(argRef).type === "scalar" ? "scalar" : "model";
|
|
809
|
+
const gqlTypeStr = "[".repeat(arrDepth) + (getGqlTypeStr(argRef) + (argRefType === "scalar" ? "Input" : "")) + "!]".repeat(arrDepth);
|
|
826
810
|
return `$${argMeta.name}: ` + gqlTypeStr + (argMeta.argsOption.nullable ? "" : "!");
|
|
827
811
|
}).join(", ")})` : "";
|
|
828
812
|
};
|
|
@@ -830,21 +814,40 @@ const makeArgAssignStr = (argMetas) => {
|
|
|
830
814
|
return argMetas.length ? `(${argMetas.map((argMeta) => `${argMeta.name}: $${argMeta.name}`).join(", ")})` : "";
|
|
831
815
|
};
|
|
832
816
|
const makeReturnStr = (returnRef, partial) => {
|
|
833
|
-
const isScalar =
|
|
817
|
+
const isScalar = isGqlScalar(returnRef);
|
|
834
818
|
if (isScalar)
|
|
835
819
|
return "";
|
|
836
|
-
const classMeta =
|
|
820
|
+
const classMeta = getClassMeta(returnRef);
|
|
837
821
|
if (!partial?.length)
|
|
838
822
|
return ` {
|
|
839
|
-
...${
|
|
823
|
+
...${lowerlize(classMeta.refName)}Fragment
|
|
840
824
|
}`;
|
|
841
825
|
const targetKeys = classMeta.type === "scalar" ? partial : [.../* @__PURE__ */ new Set(["id", ...partial, "updatedAt"])];
|
|
842
|
-
const fieldMetaMap =
|
|
826
|
+
const fieldMetaMap = getFieldMetaMap(returnRef);
|
|
843
827
|
return ` {
|
|
844
828
|
${targetKeys.map((key) => fieldMetaMap.get(key)).filter((metadata) => metadata && metadata.fieldType !== "hidden").map(
|
|
845
829
|
(fieldMeta) => fieldMeta.isClass ? ` ${fieldMeta.key} {
|
|
846
|
-
...${
|
|
830
|
+
...${lowerlize(fieldMeta.name)}Fragment
|
|
847
831
|
}` : ` ${fieldMeta.key}`
|
|
848
832
|
).join("\n")}
|
|
849
833
|
}`;
|
|
850
834
|
};
|
|
835
|
+
export {
|
|
836
|
+
CrystalizeStorage,
|
|
837
|
+
DefaultStorage,
|
|
838
|
+
FragmentStorage,
|
|
839
|
+
GqlStorage,
|
|
840
|
+
PurifyStorage,
|
|
841
|
+
deserializeArg,
|
|
842
|
+
fetchOf,
|
|
843
|
+
getGqlOnStorage,
|
|
844
|
+
getGqlStr,
|
|
845
|
+
gqlOf,
|
|
846
|
+
makeCrystalize,
|
|
847
|
+
makeDefault,
|
|
848
|
+
makeFetch,
|
|
849
|
+
makeFragment,
|
|
850
|
+
makePurify,
|
|
851
|
+
scalarUtilOf,
|
|
852
|
+
serializeArg
|
|
853
|
+
};
|
package/src/immerify.cjs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var immerify_exports = {};
|
|
19
|
+
__export(immerify_exports, {
|
|
20
|
+
immerify: () => immerify
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(immerify_exports);
|
|
23
|
+
var import_constant = require("@akanjs/constant");
|
|
24
|
+
var import_immer = require("immer");
|
|
25
|
+
const immerify = (modelRef, objOrArr) => {
|
|
26
|
+
if (Array.isArray(objOrArr))
|
|
27
|
+
return objOrArr.map((val) => immerify(modelRef, val));
|
|
28
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef);
|
|
29
|
+
const immeredObj = Object.assign({}, objOrArr, { [import_immer.immerable]: true });
|
|
30
|
+
fieldMetas.forEach((fieldMeta) => {
|
|
31
|
+
if (fieldMeta.isScalar && fieldMeta.isClass && !!objOrArr[fieldMeta.key])
|
|
32
|
+
immeredObj[fieldMeta.key] = immerify(fieldMeta.modelRef, objOrArr[fieldMeta.key]);
|
|
33
|
+
});
|
|
34
|
+
return immeredObj;
|
|
35
|
+
};
|