@akanjs/signal 0.9.47 → 0.9.49

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/esm/src/gql.js CHANGED
@@ -1,69 +1,5 @@
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";
28
- function graphql(literals, ...args) {
29
- if (typeof literals === "string")
30
- literals = [literals];
31
- let result = literals[0];
32
- args.forEach((arg, i) => {
33
- if (arg && arg.kind === "Document")
34
- result += arg.loc.source.body;
35
- else
36
- result += arg;
37
- result += literals[i + 1];
38
- });
39
- return result;
40
- }
41
1
  class GqlStorage {
42
2
  }
43
- class FragmentStorage {
44
- }
45
- class PurifyStorage {
46
- }
47
- class DefaultStorage {
48
- }
49
- class CrystalizeStorage {
50
- }
51
- const scalarUtilOf = (cnst) => {
52
- const refName = cnst.refName;
53
- const [fieldName, className] = [lowerlize(refName), capitalize(refName)];
54
- const graphQL = {
55
- refName,
56
- [className]: cnst.Model,
57
- [`default${className}`]: immerify(
58
- cnst.Model,
59
- Object.assign(new cnst.Model(), makeDefault(cnst.Model))
60
- ),
61
- [`purify${className}`]: makePurify(cnst.Model),
62
- [`crystalize${className}`]: makeCrystalize(cnst.Model),
63
- [`${fieldName}Fragment`]: makeFragment(cnst.Model)
64
- };
65
- return graphQL;
66
- };
67
3
  const getGqlOnStorage = (refName) => {
68
4
  const modelGql = Reflect.getMetadata(refName, GqlStorage.prototype);
69
5
  if (!modelGql)
@@ -73,238 +9,8 @@ const getGqlOnStorage = (refName) => {
73
9
  const setGqlOnStorage = (refName, modelGql) => {
74
10
  Reflect.defineMetadata(refName, modelGql, GqlStorage.prototype);
75
11
  };
76
- const gqlOf = (constant, sigRef, option = {}) => {
77
- const refName = constant.refName;
78
- const [fieldName, className] = [lowerlize(refName), capitalize(refName)];
79
- const sigMeta = getSigMeta(sigRef);
80
- const names = {
81
- refName,
82
- model: fieldName,
83
- Model: className,
84
- _model: `_${fieldName}`,
85
- lightModel: `light${className}`,
86
- _lightModel: `_light${className}`,
87
- purifyModel: `purify${className}`,
88
- crystalizeModel: `crystalize${className}`,
89
- lightCrystalizeModel: `lightCrystalize${className}`,
90
- crystalizeModelInsight: `crystalize${className}Insight`,
91
- defaultModel: `default${className}`,
92
- defaultModelInsight: `default${className}Insight`,
93
- mergeModel: `merge${className}`,
94
- viewModel: `view${className}`,
95
- getModelView: `get${className}View`,
96
- modelView: `${fieldName}View`,
97
- modelViewAt: `${fieldName}ViewAt`,
98
- editModel: `edit${className}`,
99
- getModelEdit: `get${className}Edit`,
100
- modelEdit: `${fieldName}Edit`,
101
- listModel: `list${className}`,
102
- modelList: `${fieldName}List`,
103
- modelObjList: `${fieldName}ObjList`,
104
- modelInsight: `${fieldName}Insight`,
105
- modelObjInsight: `${fieldName}ObjInsight`,
106
- updateModel: `update${className}`,
107
- modelObj: `${fieldName}Obj`,
108
- _modelList: `_${fieldName}List`,
109
- modelInit: `${fieldName}Init`,
110
- pageOfModel: `pageOf${className}`,
111
- lastPageOfModel: `lastPageOf${className}`,
112
- limitOfModel: `limitOf${className}`,
113
- queryArgsOfModel: `queryArgsOf${className}`,
114
- sortOfModel: `sortOf${className}`,
115
- modelInitAt: `${fieldName}InitAt`,
116
- initModel: `init${className}`,
117
- getModelInit: `get${className}Init`,
118
- addModelFiles: `add${className}Files`
119
- };
120
- const base = {
121
- refName,
122
- [names.purifyModel]: makePurify(constant.Input, option),
123
- [names.crystalizeModel]: makeCrystalize(constant.Full, option),
124
- [names.lightCrystalizeModel]: makeCrystalize(constant.Light, option),
125
- [names.crystalizeModelInsight]: makeCrystalize(constant.Insight, option),
126
- [names.defaultModel]: immerify(
127
- constant.Full,
128
- Object.assign(new constant.Full(), makeDefault(constant.Full, option))
129
- ),
130
- [names.defaultModelInsight]: Object.assign(
131
- new constant.Insight(),
132
- makeDefault(constant.Insight, option)
133
- )
134
- };
135
- const gql = Object.assign(option.overwrite ?? { client }, fetchOf(sigRef));
136
- const util = {
137
- [names.addModelFiles]: async (files, id, option2) => {
138
- const fileGql = getGqlOnStorage("file");
139
- const metas = Array.from(files).map((file) => ({ lastModifiedAt: new Date(file.lastModified), size: file.size }));
140
- return await fileGql.addFiles(
141
- files,
142
- metas,
143
- names.model,
144
- id,
145
- option2
146
- );
147
- },
148
- [names.mergeModel]: async (modelOrId, data, option2) => {
149
- const model = typeof modelOrId === "string" ? await gql[names._model](modelOrId) : modelOrId;
150
- const input = base[names.purifyModel]({ ...model, ...data });
151
- if (!input)
152
- throw new Error("Error");
153
- return await gql[names.updateModel](model.id, input, option2);
154
- },
155
- [names.viewModel]: async (id, option2) => {
156
- const modelObj = await gql[names._model](id, option2);
157
- return {
158
- [names.model]: base[names.crystalizeModel](modelObj),
159
- [names.modelView]: {
160
- refName: names.model,
161
- [names.modelObj]: modelObj,
162
- [names.modelViewAt]: /* @__PURE__ */ new Date()
163
- }
164
- };
165
- },
166
- [names.getModelView]: async (id, option2) => {
167
- const modelView = await gql[names._model](id, option2);
168
- return {
169
- refName: names.model,
170
- [names.modelObj]: modelView,
171
- [names.modelViewAt]: /* @__PURE__ */ new Date()
172
- };
173
- },
174
- [names.editModel]: async (id, option2) => {
175
- const modelObj = await gql[names._model](id, option2);
176
- return {
177
- [names.model]: base[names.crystalizeModel](modelObj),
178
- [names.modelEdit]: {
179
- refName: names.model,
180
- [names.modelObj]: modelObj,
181
- [names.modelViewAt]: /* @__PURE__ */ new Date()
182
- }
183
- };
184
- },
185
- [names.getModelEdit]: async (id, option2) => {
186
- const modelEdit = await gql[names.editModel](id, option2);
187
- return modelEdit[names.modelEdit];
188
- }
189
- };
190
- const sliceUtil = Object.fromEntries(
191
- sigMeta.slices.reduce((acc, { sliceName, argLength, defaultArgs }) => {
192
- const namesOfSlice = {
193
- modelList: sliceName.replace(names.model, names.modelList),
194
- // modelListInSelf
195
- modelInsight: sliceName.replace(names.model, names.modelInsight),
196
- // modelInsightInSelf
197
- modelInit: sliceName.replace(names.model, names.modelInit),
198
- // modelInitInSelf
199
- initModel: sliceName.replace(names.model, names.initModel),
200
- // initModelInSelf
201
- getModelInit: sliceName.replace(names.model, names.getModelInit)
202
- // getModelInitInSelf
203
- };
204
- const getInitFn = async (...args) => {
205
- const queryArgLength = Math.min(args.length, argLength);
206
- const queryArgs = [
207
- ...new Array(queryArgLength).fill(null).map((_, i) => args[i]),
208
- ...queryArgLength < argLength ? new Array(argLength - queryArgLength).fill(null).map((_, i) => defaultArgs[i + queryArgLength] ?? null) : []
209
- ];
210
- const fetchInitOption = args[argLength] ?? {};
211
- const { page = 1, limit = 20, sort = "latest", insight } = fetchInitOption;
212
- const skip = (page - 1) * limit;
213
- const [modelObjList, modelObjInsight] = await Promise.all([
214
- gql[`_${namesOfSlice.modelList}`](
215
- ...queryArgs,
216
- skip,
217
- limit,
218
- sort,
219
- fetchInitOption
220
- ),
221
- gql[`_${namesOfSlice.modelInsight}`](...queryArgs, fetchInitOption)
222
- ]);
223
- const count = modelObjInsight.count;
224
- return {
225
- // Client Component용
226
- refName: names.model,
227
- sliceName,
228
- argLength,
229
- [names.modelObjList]: modelObjList,
230
- [names.modelObjInsight]: modelObjInsight,
231
- [names.pageOfModel]: page,
232
- [names.lastPageOfModel]: Math.max(Math.floor((count - 1) / limit) + 1, 1),
233
- [names.limitOfModel]: limit,
234
- [names.queryArgsOfModel]: JSON.parse(JSON.stringify(queryArgs)),
235
- [names.sortOfModel]: sort,
236
- [names.modelInitAt]: /* @__PURE__ */ new Date()
237
- };
238
- };
239
- const initFn = async (...args) => {
240
- const modelInit = await getInitFn(...args);
241
- const modelObjList = modelInit[names.modelObjList];
242
- const modelObjInsight = modelInit[names.modelObjInsight];
243
- const modelList = new DataList(
244
- modelObjList.map((modelObj) => base[names.lightCrystalizeModel](modelObj))
245
- );
246
- const modelInsight = base[names.crystalizeModelInsight](modelObjInsight);
247
- return {
248
- [namesOfSlice.modelList]: modelList,
249
- // Server Component용
250
- [namesOfSlice.modelInsight]: modelInsight,
251
- // Server Component용
252
- [namesOfSlice.modelInit]: modelInit
253
- };
254
- };
255
- return [...acc, [namesOfSlice.getModelInit, getInitFn], [namesOfSlice.initModel, initFn]];
256
- }, [])
257
- );
258
- const overwriteSlices = option.overwrite ? option.overwrite.slices.filter(
259
- (slice) => !sigMeta.slices.some((s) => s.sliceName === slice.sliceName)
260
- ) : [];
261
- const modelGql = Object.assign(option.overwrite ?? {}, {
262
- ...gql,
263
- ...base,
264
- ...util,
265
- ...sliceUtil,
266
- slices: [...overwriteSlices, ...sigMeta.slices]
267
- });
268
- setGqlOnStorage(refName, modelGql);
269
- return modelGql;
270
- };
271
- const getPredefinedDefault = (refName) => {
272
- const defaultData = Reflect.getMetadata(refName, DefaultStorage.prototype);
273
- return defaultData;
274
- };
275
- const setPredefinedDefault = (refName, defaultData) => {
276
- Reflect.defineMetadata(refName, defaultData, DefaultStorage.prototype);
277
- };
278
- const makeDefault = (target, option = {}) => {
279
- const classMeta = getClassMeta(target);
280
- const predefinedDefault = getPredefinedDefault(classMeta.refName);
281
- if (predefinedDefault && !option.overwrite)
282
- return predefinedDefault;
283
- if (option.isChild && classMeta.type !== "scalar")
284
- return null;
285
- const metadatas = getFieldMetas(target);
286
- const result = {};
287
- for (const metadata of metadatas) {
288
- if (metadata.fieldType === "hidden")
289
- result[metadata.key] = null;
290
- else if (metadata.default) {
291
- if (typeof metadata.default === "function")
292
- result[metadata.key] = metadata.default();
293
- else if (metadata.default instanceof Enum)
294
- result[metadata.key] = [...metadata.default.values];
295
- else
296
- result[metadata.key] = metadata.default;
297
- } else if (metadata.isArray)
298
- result[metadata.key] = [];
299
- else if (metadata.nullable)
300
- result[metadata.key] = null;
301
- else if (metadata.isClass)
302
- result[metadata.key] = metadata.isScalar ? makeDefault(metadata.modelRef) : null;
303
- else
304
- result[metadata.key] = scalarDefaultMap.get(metadata.modelRef);
305
- }
306
- setPredefinedDefault(classMeta.refName, result);
307
- return result;
12
+ const gqlOf = (constant, filterRef, sigRef, option = {}) => {
13
+ return null;
308
14
  };
309
15
  const query = async (fetchClient, query2, variables = {}, option = {}) => {
310
16
  const jwt = option.url ? null : await fetchClient.getJwt();
@@ -356,502 +62,19 @@ const mutate = async (fetchClient, mutation, variables = {}, option = {}) => {
356
62
  }
357
63
  return data;
358
64
  };
359
- const scalarPurifyMap = /* @__PURE__ */ new Map([
360
- [Date, (value) => dayjs(value).toDate()],
361
- [String, (value) => value],
362
- [ID, (value) => value],
363
- [Boolean, (value) => value],
364
- [Int, (value) => value],
365
- [Float, (value) => value],
366
- [GqlJSON, (value) => value]
367
- ]);
368
- const getPurifyFn = (modelRef) => {
369
- const [valueRef] = getNonArrayModel(modelRef);
370
- return scalarPurifyMap.get(valueRef) ?? ((value) => value);
371
- };
372
- const purify = (metadata, value, self) => {
373
- if (metadata.nullable && (value === null || value === void 0 || typeof value === "number" && isNaN(value) || typeof value === "string" && !value.length))
374
- return null;
375
- if (metadata.isArray) {
376
- if (!Array.isArray(value))
377
- throw new Error(`Invalid Array Value in ${metadata.key} for value ${value}`);
378
- if (metadata.minlength && value.length < metadata.minlength)
379
- throw new Error(`Invalid Array Length (Min) in ${metadata.key} for value ${value}`);
380
- else if (metadata.maxlength && value.length > metadata.maxlength)
381
- throw new Error(`Invalid Array Length (Max) in ${metadata.key} for value ${value}`);
382
- else if (metadata.optArrDepth === 0 && metadata.validate && !metadata.validate(value, self))
383
- throw new Error(`Invalid Array Value (Failed to pass validation) in ${metadata.key} for value ${value}`);
384
- return value.map((v) => purify({ ...metadata, isArray: false }, v, v));
385
- }
386
- if (metadata.isMap && metadata.of) {
387
- const purifyFn2 = getPurifyFn(metadata.of);
388
- return Object.fromEntries(
389
- [...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, purifyFn2)])
390
- );
391
- }
392
- if (metadata.isClass)
393
- return makePurify(metadata.modelRef)(value, true);
394
- if (metadata.name === "Date" && dayjs(value).isBefore(dayjs(/* @__PURE__ */ new Date("0000"))))
395
- throw new Error(`Invalid Date Value (Default) in ${metadata.key} for value ${value}`);
396
- if (["String", "ID"].includes(metadata.name) && (value === "" || !value))
397
- throw new Error(`Invalid String Value (Default) in ${metadata.key} for value ${value}`);
398
- if (metadata.validate && !metadata.validate(value, self))
399
- throw new Error(`Invalid Value (Failed to pass validation) / ${value} in ${metadata.key}`);
400
- if (!metadata.nullable && !value && value !== 0 && value !== false)
401
- throw new Error(`Invalid Value (Nullable) in ${metadata.key} for value ${value}`);
402
- const purifyFn = getPurifyFn(metadata.modelRef);
403
- return purifyFn(value);
404
- };
405
- const getPredefinedPurifyFn = (refName) => {
406
- const purify2 = Reflect.getMetadata(refName, PurifyStorage.prototype);
407
- return purify2;
408
- };
409
- const setPredefinedPurifyFn = (refName, purify2) => {
410
- Reflect.defineMetadata(refName, purify2, PurifyStorage.prototype);
411
- };
412
- const makePurify = (target, option = {}) => {
413
- const classMeta = getClassMeta(target);
414
- const purifyFn = getPredefinedPurifyFn(classMeta.refName);
415
- if (purifyFn && !option.overwrite)
416
- return purifyFn;
417
- const metadatas = getFieldMetas(target);
418
- const fn = (self, isChild) => {
419
- try {
420
- if (isChild && classMeta.type !== "scalar") {
421
- const id = self.id;
422
- if (!id)
423
- throw new Error(`Invalid Value (No ID) for id ${classMeta.refName}`);
424
- return id;
425
- }
426
- const result = {};
427
- for (const metadata of metadatas) {
428
- const value = self[metadata.key];
429
- result[metadata.key] = purify(metadata, value, self);
430
- }
431
- return result;
432
- } catch (err) {
433
- if (isChild)
434
- throw new Error(err);
435
- Logger.debug(err);
436
- return null;
437
- }
438
- };
439
- setPredefinedPurifyFn(classMeta.refName, fn);
440
- return fn;
441
- };
442
- const scalarCrystalizeMap = /* @__PURE__ */ new Map([
443
- [Date, (value) => dayjs(value)],
444
- [String, (value) => value],
445
- [ID, (value) => value],
446
- [Boolean, (value) => value],
447
- [Int, (value) => value],
448
- [Float, (value) => value],
449
- [GqlJSON, (value) => value]
450
- ]);
451
- const crystalize = (metadata, value) => {
452
- if (value === void 0 || value === null)
453
- return value;
454
- if (metadata.isArray && Array.isArray(value))
455
- return value.map((v) => crystalize({ ...metadata, isArray: false }, v));
456
- if (metadata.isMap) {
457
- const [valueRef] = getNonArrayModel(metadata.of);
458
- const crystalizeValue = scalarCrystalizeMap.get(valueRef) ?? ((value2) => value2);
459
- return new Map(
460
- Object.entries(value).map(([key, val]) => [key, applyFnToArrayObjects(val, crystalizeValue)])
461
- );
462
- }
463
- if (metadata.isClass)
464
- return makeCrystalize(metadata.modelRef)(value, true);
465
- if (metadata.name === "Date")
466
- return dayjs(value);
467
- return (scalarCrystalizeMap.get(metadata.modelRef) ?? ((value2) => value2))(value);
468
- };
469
- const getPredefinedCrystalizeFn = (refName) => {
470
- const crystalize2 = Reflect.getMetadata(refName, CrystalizeStorage.prototype);
471
- return crystalize2;
472
- };
473
- const setPredefinedCrystalizeFn = (refName, crystalize2) => {
474
- Reflect.defineMetadata(refName, crystalize2, CrystalizeStorage.prototype);
475
- };
476
- const makeCrystalize = (target, option = {}) => {
477
- const classMeta = getClassMeta(target);
478
- const crystalizeFn = getPredefinedCrystalizeFn(classMeta.refName);
479
- if (crystalizeFn && !option.overwrite && !option.partial?.length)
480
- return crystalizeFn;
481
- const fieldMetaMap = getFieldMetaMap(target);
482
- const fieldKeys = option.partial?.length ? classMeta.type === "scalar" ? option.partial : ["id", ...option.partial, "updatedAt"] : [...fieldMetaMap.keys()];
483
- const metadatas = fieldKeys.map((key) => fieldMetaMap.get(key));
484
- const fn = (self, isChild) => {
485
- try {
486
- const result = Object.assign(new target(), self);
487
- for (const metadata of metadatas.filter((m) => !!self[m.key])) {
488
- if (metadata.fieldType === "hidden")
489
- continue;
490
- result[metadata.key] = crystalize(metadata, self[metadata.key]);
491
- }
492
- return result;
493
- } catch (err) {
494
- if (isChild)
495
- throw new Error(err);
496
- return null;
497
- }
498
- };
499
- if (!option.partial?.length)
500
- setPredefinedCrystalizeFn(classMeta.refName, fn);
501
- return fn;
502
- };
503
- const fragmentize = (target, fragMap = /* @__PURE__ */ new Map(), partial) => {
504
- const classMeta = getClassMeta(target);
505
- const metadatas = getFieldMetas(target);
506
- const selectKeys = partial ? ["id", ...partial, "updatedAt"] : metadatas.map((metadata) => metadata.key);
507
- const selectKeySet = new Set(selectKeys);
508
- const fragment = `fragment ${lowerlize(classMeta.refName)}Fragment on ${capitalize(
509
- classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName
510
- )} {
511
- ` + metadatas.filter((metadata) => metadata.fieldType !== "hidden" && selectKeySet.has(metadata.key)).map((metadata) => {
512
- return metadata.isClass ? ` ${metadata.key} {
513
- ...${lowerlize(metadata.name)}Fragment
514
- }` : ` ${metadata.key}`;
515
- }).join(`
516
- `) + `
517
- }`;
518
- fragMap.set(classMeta.refName, fragment);
519
- metadatas.filter((metadata) => metadata.fieldType !== "hidden" && selectKeySet.has(metadata.key) && metadata.isClass).forEach((metadata) => fragmentize(metadata.modelRef, fragMap));
520
- return fragMap;
521
- };
522
- const getPredefinedFragment = (refName) => {
523
- const fragment = Reflect.getMetadata(refName, FragmentStorage.prototype);
524
- return fragment;
525
- };
526
- const setPredefinedFragment = (refName, fragment) => {
527
- Reflect.defineMetadata(refName, fragment, FragmentStorage.prototype);
528
- };
529
- const makeFragment = (target, option = {}) => {
530
- const classMeta = getClassMeta(target);
531
- const fragment = getPredefinedFragment(classMeta.refName);
532
- if (fragment && !option.overwrite && !option.excludeSelf && !option.partial?.length)
533
- return fragment;
534
- const fragMap = new Map(fragmentize(target, /* @__PURE__ */ new Map(), option.partial));
535
- if (option.excludeSelf)
536
- fragMap.delete(classMeta.refName);
537
- const gqlStr = [...fragMap.values()].join("\n");
538
- if (!option.excludeSelf)
539
- setPredefinedFragment(classMeta.refName, gqlStr);
540
- return gqlStr;
541
- };
542
- const getGqlStr = (modelRef, gqlMeta, argMetas, returnRef, partial) => {
543
- const isScalar = isGqlScalar(modelRef);
544
- const argStr = makeArgStr(argMetas);
545
- const argAssignStr = makeArgAssignStr(argMetas);
546
- const returnStr = makeReturnStr(returnRef, partial);
547
- const gqlStr = `${isScalar ? "" : makeFragment(returnRef, { excludeSelf: !!partial?.length, partial })}
548
- ${lowerlize(gqlMeta.type) + " " + gqlMeta.key + argStr}{
549
- ${gqlMeta.key}${argAssignStr}${returnStr}
550
- }
551
- `;
552
- return gqlStr;
553
- };
554
- const scalarSerializeMap = /* @__PURE__ */ new Map([
555
- [Date, (value) => dayjs(value).toDate()],
556
- [String, (value) => value],
557
- [ID, (value) => value],
558
- [Boolean, (value) => value],
559
- [Int, (value) => value],
560
- [Float, (value) => value],
561
- [GqlJSON, (value) => value]
562
- ]);
563
- const getSerializeFn = (inputRef) => {
564
- const serializeFn = scalarSerializeMap.get(inputRef);
565
- if (!serializeFn)
566
- return (value) => value;
567
- else
568
- return serializeFn;
569
- };
570
- const serializeInput = (value, inputRef, arrDepth) => {
571
- if (arrDepth && Array.isArray(value))
572
- return value.map((v) => serializeInput(v, inputRef, arrDepth - 1));
573
- else if (inputRef.prototype === Map.prototype) {
574
- const [valueRef] = getNonArrayModel(inputRef);
575
- const serializeFn = getSerializeFn(valueRef);
576
- return Object.fromEntries(
577
- [...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, serializeFn)])
578
- );
579
- } else if (isGqlScalar(inputRef)) {
580
- const serializeFn = getSerializeFn(inputRef);
581
- return serializeFn(value);
582
- }
583
- const classMeta = getClassMeta(inputRef);
584
- if (classMeta.type !== "scalar")
585
- return value;
586
- else
587
- return Object.fromEntries(
588
- getFieldMetas(inputRef).map((fieldMeta) => [
589
- fieldMeta.key,
590
- serializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
591
- ])
592
- );
593
- };
594
- const serializeArg = (argMeta, value) => {
595
- const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
596
- if (argMeta.argsOption.nullable && (value === null || value === void 0))
597
- return null;
598
- else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
599
- throw new Error(`Invalid Value (Nullable) in ${argMeta.name} for value ${value}`);
600
- return serializeInput(value, returnRef, arrDepth);
601
- };
602
- const scalarDeserializeMap = /* @__PURE__ */ new Map([
603
- [Date, (value) => dayjs(value)],
604
- [String, (value) => value],
605
- [ID, (value) => value],
606
- [Boolean, (value) => value],
607
- [Int, (value) => value],
608
- [Float, (value) => value],
609
- [GqlJSON, (value) => value]
610
- ]);
611
- const getDeserializeFn = (inputRef) => {
612
- const deserializeFn = scalarDeserializeMap.get(inputRef);
613
- if (!deserializeFn)
614
- return (value) => value;
615
- return deserializeFn;
616
- };
617
- const deserializeInput = (value, inputRef, arrDepth) => {
618
- if (arrDepth && Array.isArray(value))
619
- return value.map((v) => deserializeInput(v, inputRef, arrDepth - 1));
620
- else if (inputRef.prototype === Map.prototype) {
621
- const [valueRef] = getNonArrayModel(inputRef);
622
- const deserializeFn = getDeserializeFn(valueRef);
623
- return Object.fromEntries(
624
- [...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, deserializeFn)])
625
- );
626
- } else if (isGqlScalar(inputRef)) {
627
- const deserializeFn = getDeserializeFn(inputRef);
628
- return deserializeFn(value);
629
- }
630
- const classMeta = getClassMeta(inputRef);
631
- if (classMeta.type !== "scalar")
632
- return value;
633
- else
634
- return Object.fromEntries(
635
- getFieldMetas(inputRef).map((fieldMeta) => [
636
- fieldMeta.key,
637
- deserializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
638
- ])
639
- );
640
- };
641
- const deserializeArg = (argMeta, value) => {
642
- const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
643
- if (argMeta.argsOption.nullable && (value === null || value === void 0))
644
- return null;
645
- else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
646
- throw new Error(`Invalid Value (Nullable) in ${argMeta.name} for value ${value}`);
647
- return deserializeInput(value, returnRef, arrDepth);
648
- };
649
65
  const fetchOf = (sigRef) => {
650
- const gqls = {};
651
- const gqlMetas = getGqlMetas(sigRef);
652
- gqlMetas.filter((gqlMeta) => !gqlMeta.signalOption.default).forEach((gqlMeta) => {
653
- if (gqlMeta.type === "Message") {
654
- const [returnRef, arrDepth] = getNonArrayModel(gqlMeta.returns());
655
- const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
656
- const isScalar = isGqlScalar(returnRef);
657
- const emitEvent = function(...args) {
658
- const fetchPolicy = args[argMetas.length] ?? { crystalize: true };
659
- if (!this.client.io && !fetchPolicy.url) {
660
- Logger.warn(`${gqlMeta.key} emit suppressed - socket is not connected`);
661
- return;
662
- }
663
- const message = Object.fromEntries(
664
- argMetas.map((argMeta) => [argMeta.name, serializeArg(argMeta, args[argMeta.idx]) ?? null])
665
- );
666
- if (fetchPolicy.transport === "udp") {
667
- if (!this.client.udp)
668
- throw new Error("UDP is not set");
669
- const uri = fetchPolicy.url ?? "udpout:localhost:4000";
670
- const [host, port] = uri.split(":").slice(1);
671
- this.client.udp.send(JSON.stringify(message), parseInt(port), host);
672
- Logger.debug(`udp emit: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
673
- return;
674
- } else {
675
- const io = this.client.getIo(fetchPolicy.url);
676
- void this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
677
- io.emit(gqlMeta.key, message);
678
- Logger.debug(`socket emit: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
679
- });
680
- }
681
- };
682
- const listenEvent = function(handleEvent, fetchPolicy = {}) {
683
- const crystalize2 = (data) => {
684
- if (isScalar) {
685
- if (returnRef.prototype === Date.prototype)
686
- return dayjs(data);
687
- else
688
- return data;
689
- } else if (Array.isArray(data))
690
- return data.map((d) => crystalize2(d));
691
- else
692
- return makeCrystalize(returnRef)(data);
693
- };
694
- const handle = (data) => {
695
- Logger.debug(`socket listened: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
696
- handleEvent(crystalize2(data));
697
- };
698
- const io = this.client.getIo(fetchPolicy.url);
699
- this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
700
- io.removeListener(gqlMeta.key, handle);
701
- io.on(gqlMeta.key, handle);
702
- Logger.debug(`socket listen start: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
703
- });
704
- return async () => {
705
- await this.client.waitUntilWebSocketConnected(fetchPolicy.url);
706
- Logger.debug(`socket listen end: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
707
- io.removeListener(gqlMeta.key, handle);
708
- };
709
- };
710
- gqls[gqlMeta.key] = emitEvent;
711
- gqls[`listen${capitalize(gqlMeta.key)}`] = listenEvent;
712
- } else if (gqlMeta.type === "Pubsub") {
713
- const [returnRef] = getNonArrayModel(gqlMeta.returns());
714
- const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
715
- const isScalar = isGqlScalar(returnRef);
716
- const makeRoomId = (gqlKey, argValues) => `${gqlKey}-${argValues.join("-")}`;
717
- const crystalize2 = (data) => {
718
- if (isScalar) {
719
- if (returnRef.prototype === Date.prototype)
720
- return dayjs(data);
721
- else
722
- return data;
723
- } else if (Array.isArray(data))
724
- return data.map((d) => crystalize2(d));
725
- else
726
- return makeCrystalize(returnRef)(data);
727
- };
728
- const subscribeEvent = function(...args) {
729
- const onData = args[argMetas.length];
730
- const fetchPolicy = args[argMetas.length + 1] ?? { crystalize: true };
731
- const message = Object.fromEntries(
732
- argMetas.map((argMeta) => [argMeta.name, serializeArg(argMeta, args[argMeta.idx]) ?? null])
733
- );
734
- const handleEvent = (data) => {
735
- if (data.__subscribe__)
736
- return;
737
- onData(crystalize2(data));
738
- };
739
- const roomId = makeRoomId(
740
- gqlMeta.key,
741
- argMetas.map((argMeta) => message[argMeta.name])
742
- );
743
- const io = this.client.getIo(fetchPolicy.url);
744
- void this.client.waitUntilWebSocketConnected(fetchPolicy.url).then(() => {
745
- Logger.debug(`socket subscribe start: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
746
- io.subscribe({ key: gqlMeta.key, roomId, message, handleEvent });
747
- });
748
- return async () => {
749
- //! 앱에서 다른 앱 넘어갈 때 언마운트 되버리면서 subscribe가 끊기는 일이 있음.
750
- await this.client.waitUntilWebSocketConnected(fetchPolicy.url);
751
- Logger.debug(`socket unsubscribe: ${gqlMeta.key}: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
752
- io.unsubscribe(roomId, handleEvent);
753
- };
754
- };
755
- gqls[`subscribe${capitalize(gqlMeta.key)}`] = subscribeEvent;
756
- } else if (gqlMeta.type === "Query" || gqlMeta.type === "Mutation") {
757
- const name = gqlMeta.signalOption.name ?? gqlMeta.key;
758
- const makeReq = ({ resolve }) => async function(...args) {
759
- Logger.debug(`fetch: ${gqlMeta.key} start: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
760
- const now = Date.now();
761
- const [argMetas] = getArgMetas(sigRef, gqlMeta.signalOption.name ?? gqlMeta.key);
762
- const [modelRef, arrDepth] = getNonArrayModel(gqlMeta.returns());
763
- const isScalar = isGqlScalar(modelRef);
764
- const returnRef = isScalar || !arrDepth ? modelRef : getLightModelRef(modelRef);
765
- const fetchPolicy = args[argMetas.length] ?? { crystalize: true };
766
- const partial = fetchPolicy.partial ?? gqlMeta.signalOption.partial;
767
- const crystalize2 = (data) => {
768
- if (fetchPolicy.crystalize === false)
769
- return data;
770
- if (isScalar) {
771
- if (returnRef.prototype === Date.prototype)
772
- return dayjs(data);
773
- else
774
- return data;
775
- } else if (Array.isArray(data))
776
- return data.map((d) => crystalize2(d));
777
- else
778
- return makeCrystalize(returnRef, { partial })(data);
779
- };
780
- try {
781
- const res = (await (gqlMeta.type === "Query" ? query : mutate)(
782
- this.client,
783
- graphql(getGqlStr(modelRef, gqlMeta, argMetas, returnRef, partial)),
784
- Object.fromEntries(
785
- argMetas.map((argMeta) => [argMeta.name, serializeArg(argMeta, args[argMeta.idx]) ?? null])
786
- ),
787
- fetchPolicy
788
- ))[name];
789
- const data = resolve ? crystalize2(res) : res;
790
- Logger.debug(
791
- `fetch: ${gqlMeta.key} end: ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")} ${Date.now() - now}ms`
792
- );
793
- return data;
794
- } catch (e) {
795
- Logger.error(`fetch: ${gqlMeta.key} error: ${e}`);
796
- throw e;
797
- }
798
- };
799
- gqls[name] = makeReq({ resolve: true });
800
- gqls[`_${name}`] = makeReq({ resolve: false });
801
- }
802
- });
803
- return gqls;
66
+ return null;
804
67
  };
805
68
  const makeFetch = (...fetches) => {
806
- const [f1, ...rest] = fetches;
807
- return Object.assign(f1, ...rest);
808
- };
809
- const makeArgStr = (argMetas) => {
810
- return argMetas.length ? `(${argMetas.map((argMeta) => {
811
- const [argRef, arrDepth] = getNonArrayModel(argMeta.returns());
812
- const argRefType = isGqlScalar(argRef) ? "gqlScalar" : getClassMeta(argRef).type === "scalar" ? "scalar" : "model";
813
- const gqlTypeStr = "[".repeat(arrDepth) + (getGqlTypeStr(argRef) + (argRefType === "scalar" ? "Input" : "")) + "!]".repeat(arrDepth);
814
- return `$${argMeta.name}: ` + gqlTypeStr + (argMeta.argsOption.nullable ? "" : "!");
815
- }).join(", ")})` : "";
816
- };
817
- const makeArgAssignStr = (argMetas) => {
818
- return argMetas.length ? `(${argMetas.map((argMeta) => `${argMeta.name}: $${argMeta.name}`).join(", ")})` : "";
819
- };
820
- const makeReturnStr = (returnRef, partial) => {
821
- const isScalar = isGqlScalar(returnRef);
822
- if (isScalar)
823
- return "";
824
- const classMeta = getClassMeta(returnRef);
825
- if (!partial?.length)
826
- return ` {
827
- ...${lowerlize(classMeta.refName)}Fragment
828
- }`;
829
- const targetKeys = classMeta.type === "scalar" ? partial : [.../* @__PURE__ */ new Set(["id", ...partial, "updatedAt"])];
830
- const fieldMetaMap = getFieldMetaMap(returnRef);
831
- return ` {
832
- ${targetKeys.map((key) => fieldMetaMap.get(key)).filter((metadata) => metadata && metadata.fieldType !== "hidden").map(
833
- (fieldMeta) => fieldMeta.isClass ? ` ${fieldMeta.key} {
834
- ...${lowerlize(fieldMeta.name)}Fragment
835
- }` : ` ${fieldMeta.key}`
836
- ).join("\n")}
837
- }`;
69
+ return null;
838
70
  };
839
71
  export {
840
- CrystalizeStorage,
841
- DefaultStorage,
842
- FragmentStorage,
843
72
  GqlStorage,
844
- PurifyStorage,
845
- deserializeArg,
846
73
  fetchOf,
847
74
  getGqlOnStorage,
848
- getGqlStr,
849
75
  gqlOf,
850
- makeCrystalize,
851
- makeDefault,
852
76
  makeFetch,
853
- makeFragment,
854
- makePurify,
855
- scalarUtilOf,
856
- serializeArg
77
+ mutate,
78
+ query,
79
+ setGqlOnStorage
857
80
  };