apollo-conn-gen 0.4.0 → 0.4.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.
- package/dist/json/io/writer.js +3 -3
- package/dist/json/io/writer.js.map +1 -1
- package/dist/json/walker/jsonContext.d.ts +4 -0
- package/dist/json/walker/jsonContext.js +10 -0
- package/dist/json/walker/jsonContext.js.map +1 -1
- package/dist/json/walker/jsonGen.js +1 -0
- package/dist/json/walker/jsonGen.js.map +1 -1
- package/dist/json/walker/types/jsonArray.js +2 -2
- package/dist/json/walker/types/jsonArray.js.map +1 -1
- package/dist/json/walker/types/jsonObj.d.ts +3 -4
- package/dist/json/walker/types/jsonObj.js +4 -4
- package/dist/json/walker/types/jsonObj.js.map +1 -1
- package/dist/json/walker/types/jsonScalar.d.ts +3 -4
- package/dist/json/walker/types/jsonScalar.js +3 -3
- package/dist/json/walker/types/jsonScalar.js.map +1 -1
- package/dist/json/walker/types/jsonType.d.ts +2 -5
- package/dist/json/walker/types/jsonType.js +0 -6
- package/dist/json/walker/types/jsonType.js.map +1 -1
- package/package.json +1 -1
package/dist/json/io/writer.js
CHANGED
|
@@ -37,9 +37,9 @@ export class ConnectorWriter {
|
|
|
37
37
|
selection: """` +
|
|
38
38
|
'\n');
|
|
39
39
|
writer.write(walker.writeSelection());
|
|
40
|
-
|
|
41
|
-
)
|
|
42
|
-
|
|
40
|
+
const ctx = walker.getContext();
|
|
41
|
+
writer.write(ctx.getIndent() + '"""\n');
|
|
42
|
+
writer.write(ctx.getIndentWith(2) + ')}');
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
//# sourceMappingURL=writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/json/io/writer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IACvB,OAAO,GAAa,EAAE,CAAC;IAEvB,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACnB,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,MAAe;QAC3C,MAAM,CAAC,KAAK,CAAC;;;;;;;;CAQhB,CAAC,CAAC;IACD,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAe,EAAE,MAAe;QACxD,MAAM,CAAC,KAAK,CACV,IAAI;YACF;;;;;qBAKa;YACb,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/json/io/writer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IACvB,OAAO,GAAa,EAAE,CAAC;IAEvB,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACnB,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,MAAe;QAC3C,MAAM,CAAC,KAAK,CAAC;;;;;;;;CAQhB,CAAC,CAAC;IACD,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAe,EAAE,MAAe;QACxD,MAAM,CAAC,KAAK,CACV,IAAI;YACF;;;;;qBAKa;YACb,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF","sourcesContent":["import { JsonGen } from '../walker/jsonGen.js';\n\nexport interface IWriter {\n write(text: string): void;\n}\n\nexport class StringWriter implements IWriter {\n builder: string[] = [];\n\n write(text: string): void {\n this.builder.push(text);\n }\n\n flush(): string {\n return this.builder.join('');\n }\n\n clear(): void {\n this.builder = [];\n }\n}\n\nexport class ConnectorWriter {\n public static write(walker: JsonGen, writer: IWriter): void {\n this.writeConnector(writer);\n writer.write(walker.writeTypes());\n this.writeQuery(walker, writer);\n }\n\n private static writeConnector(writer: IWriter): void {\n writer.write(`extend schema\n @link(url: \"https://specs.apollo.dev/federation/v2.10\", import: [\"@key\"])\n @link(\n url: \"https://specs.apollo.dev/connect/v0.1\"\n import: [\"@connect\", \"@source\"]\n )\n @source(name: \"api\", http: { baseURL: \"http://localhost:4010\" })\n \n`);\n }\n\n private static writeQuery(walker: JsonGen, writer: IWriter): void {\n writer.write(\n '\\n' +\n `type Query {\n root: Root\n @connect(\n source: \"api\"\n http: { GET: \"/test\" }\n selection: \"\"\"` +\n '\\n',\n );\n\n writer.write(walker.writeSelection());\n\n const ctx = walker.getContext();\n\n writer.write(ctx.getIndent() + '\"\"\"\\n');\n writer.write(ctx.getIndentWith(2) + ')}');\n }\n}\n"]}
|
|
@@ -2,8 +2,12 @@ import { JsonType } from '../walker/types/jsonType.js';
|
|
|
2
2
|
export declare class JsonContext {
|
|
3
3
|
private stack;
|
|
4
4
|
private types;
|
|
5
|
+
private indent;
|
|
5
6
|
constructor();
|
|
6
7
|
getStack(): JsonType[];
|
|
8
|
+
getIndent(): string;
|
|
9
|
+
getIndentWith(subtract: number): string;
|
|
10
|
+
setIndent(indent: number): void;
|
|
7
11
|
enter(element: JsonType): void;
|
|
8
12
|
leave(_element: JsonType): void;
|
|
9
13
|
store(type: JsonType): void;
|
|
@@ -2,6 +2,7 @@ import { JsonObj } from '../walker/types/jsonObj.js';
|
|
|
2
2
|
export class JsonContext {
|
|
3
3
|
stack;
|
|
4
4
|
types;
|
|
5
|
+
indent = 0;
|
|
5
6
|
constructor() {
|
|
6
7
|
this.stack = [];
|
|
7
8
|
this.types = new Map();
|
|
@@ -9,6 +10,15 @@ export class JsonContext {
|
|
|
9
10
|
getStack() {
|
|
10
11
|
return this.stack;
|
|
11
12
|
}
|
|
13
|
+
getIndent() {
|
|
14
|
+
return ' '.repeat(this.stack.length + this.indent);
|
|
15
|
+
}
|
|
16
|
+
getIndentWith(subtract) {
|
|
17
|
+
return ' '.repeat(this.stack.length - subtract + this.indent);
|
|
18
|
+
}
|
|
19
|
+
setIndent(indent) {
|
|
20
|
+
this.indent = indent;
|
|
21
|
+
}
|
|
12
22
|
enter(element) {
|
|
13
23
|
// trace(this, "[context]", "-> enter: (" + this.stack.length + ") " + element.getName());
|
|
14
24
|
this.stack.push(element);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonContext.js","sourceRoot":"","sources":["../../../src/json/walker/jsonContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,MAAM,OAAO,WAAW;IACd,KAAK,CAAa;IAClB,KAAK,CAAwB;
|
|
1
|
+
{"version":3,"file":"jsonContext.js","sourceRoot":"","sources":["../../../src/json/walker/jsonContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,MAAM,OAAO,WAAW;IACd,KAAK,CAAa;IAClB,KAAK,CAAwB;IAC7B,MAAM,GAAW,CAAC,CAAC;IAE3B;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,SAAS;QACd,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAEM,aAAa,CAAC,QAAgB;QACnC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,OAAiB;QAC5B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,QAAkB;QAC7B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,IAAc;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,uCAAuC;QACvC,IAAI,MAAM,YAAY,OAAO,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAe,EAAE,GAAW,EAAE,EAAE;gBACxD,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF","sourcesContent":["import { JsonObj } from '../walker/types/jsonObj.js';\nimport { JsonType } from '../walker/types/jsonType.js';\n\nexport class JsonContext {\n private stack: JsonType[];\n private types: Map<string, JsonType>;\n private indent: number = 0;\n\n constructor() {\n this.stack = [];\n this.types = new Map<string, JsonType>();\n }\n\n public getStack(): JsonType[] {\n return this.stack;\n }\n\n public getIndent(): string {\n return ' '.repeat(this.stack.length + this.indent);\n }\n\n public getIndentWith(subtract: number): string {\n return ' '.repeat(this.stack.length - subtract + this.indent);\n }\n\n public setIndent(indent: number): void {\n this.indent = indent;\n }\n\n public enter(element: JsonType): void {\n // trace(this, \"[context]\", \"-> enter: (\" + this.stack.length + \") \" + element.getName());\n this.stack.push(element);\n }\n\n public leave(_element: JsonType): void {\n // trace(this, \"[context]\", \"<- leave: (\" + this.stack.length + \") \" + element.getName());\n this.stack.pop();\n }\n\n public store(type: JsonType): void {\n if (this.types.has(type.id())) {\n this.merge(type);\n } else {\n this.types.set(type.id(), type);\n }\n }\n\n private merge(type: JsonType): void {\n const source = this.types.get(type.id());\n // Only merge if both are Obj instances\n if (source instanceof JsonObj && type instanceof JsonObj) {\n type.getFields().forEach((value: JsonType, key: string) => {\n source.getFields().set(key, value);\n });\n this.types.set(source.id(), source);\n }\n }\n\n public getTypes(): JsonType[] {\n return Array.from(this.types.values());\n }\n}\n"]}
|
|
@@ -36,6 +36,7 @@ export class JsonGen {
|
|
|
36
36
|
// Writes selection using a given Writer
|
|
37
37
|
writeSelection() {
|
|
38
38
|
const writer = new StringWriter();
|
|
39
|
+
this.context.setIndent(6);
|
|
39
40
|
const types = this.context.getTypes();
|
|
40
41
|
const root = types.find((t) => t.getParent() === null);
|
|
41
42
|
if (root) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonGen.js","sourceRoot":"","sources":["../../../src/json/walker/jsonGen.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport _ from 'lodash';\nimport { ConnectorWriter, JsonArray, JsonContext, JsonObj, JsonScalar, JsonType, StringWriter } from '../index.js';\nimport { trace, warn } from './log/trace.js';\nimport { sanitiseField } from './naming.js';\n\nexport class JsonGen {\n private readonly context: JsonContext;\n\n // Private constructor\n private constructor() {\n this.context = new JsonContext();\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n public static new(): JsonGen {\n return new JsonGen();\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string): JsonGen {\n const walker = new JsonGen();\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[]): JsonGen {\n const walker = new JsonGen();\n for (const json of jsons) {\n walker.walkJson(json);\n }\n return walker;\n }\n\n public generateSchema(): string {\n const writer = new StringWriter();\n ConnectorWriter.write(this, writer);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n root.select(this.context, writer);\n }\n\n return writer.flush();\n }\n\n // Writes all types in order using the provided Writer\n public writeTypes(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n const orderedSet = new Set<JsonType>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((t) => {\n // Assumes t is an Obj\n const obj = t as unknown as JsonObj;\n let typeName = obj.getType();\n if (generatedSet.has(typeName)) {\n // If same type, skip generation\n if (_.isEqual(obj, generatedSet.get(typeName))) {\n return;\n }\n obj.setType(JsonGen.generateNewObjType(generatedSet, t, typeName));\n typeName = obj.getType();\n }\n t.write(this.context, writer);\n generatedSet.set(typeName, t);\n });\n\n console.log('orderedSet =', Array.from(orderedSet));\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonType>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from((type as JsonObj).getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = (type as JsonArray).getArrayType();\n if (arrayType) {\n this.writeType(arrayType, orderedSet);\n }\n }\n }\n\n // Walk the JSON provided as a string\n public walkJson(json: string): void {\n const rootElement = JSON.parse(json);\n this.walkElement(this.context, null, 'root', rootElement);\n trace(this.context, ' [walkSource]', 'types found: ' + this.context.getTypes().length);\n }\n\n // Walk an element in the JSON tree\n private walkElement(context: JsonContext, parent: JsonType | null, name: string, element: any): JsonType {\n trace(context, '-> [walkElement]', 'in: ' + name);\n let result: JsonType;\n\n if (typeof element === 'object' && !Array.isArray(element) && element !== null) {\n // JSON object\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n } else if (Array.isArray(element)) {\n result = this.walkArray(context, parent, name, element);\n } else if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n result = this.walkPrimitive(context, parent, name, element);\n } else {\n throw new Error(\"Cannot yet handle '\" + name + \"' of type \" + typeof element);\n }\n\n trace(context, '<- [walkElement]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON object\n private walkObject(context: JsonContext, parent: JsonType | null, name: string, object: any): JsonObj {\n trace(context, '-> [walkObject]', 'in: ' + name);\n const result = new JsonObj(name, parent);\n const fieldSet = Object.keys(object);\n trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);\n\n for (const field of fieldSet) {\n trace(context, ' [walkObject]', 'field: ' + field);\n const childElement = object[field];\n const type = this.walkElement(context, result, field, childElement);\n result.add(field, type);\n }\n\n trace(context, '<- [walkObject]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON array\n private walkArray(context: JsonContext, parent: JsonType | null, name: string, array: any[]): JsonArray {\n trace(context, '-> [walkArray]', 'in: ' + name);\n const result = new JsonArray(name, parent);\n if (array.length > 0) {\n const firstElement = array[0];\n const arrayType = this.walkElement(context, parent, name, firstElement);\n result.setArrayType(arrayType);\n } else {\n warn(context, ' [walkArray]', \"Array is empty -- cannot derive type for field '\" + name + \"'\");\n }\n trace(context, '-> [walkArray]', 'in: ' + name);\n return result;\n }\n\n // Walk a primitive JSON value\n private walkPrimitive(_context: JsonContext, parent: JsonType | null, name: string, primitive: any): JsonScalar {\n let result: JsonScalar;\n if (typeof primitive === 'string') {\n result = new JsonScalar(name, parent, 'String');\n } else if (typeof primitive === 'boolean') {\n result = new JsonScalar(name, parent, 'Boolean');\n } else if (typeof primitive === 'number') {\n result = new JsonScalar(name, parent, 'Int');\n } else {\n throw new Error('Cannot yet handle primitive: ' + primitive);\n }\n return result;\n }\n\n // Utility method for naming conflict resolution\n private static generateNewObjType(generatedSet: Map<string, JsonType>, t: JsonType, typeName: string): string {\n let newName: string;\n let type: JsonType | null = t;\n do {\n const parent: JsonType | null = type.getParent();\n const parentName = parent === null ? '' : sanitiseField(parent.getName()).replace(/^\\w/, (c) => c.toUpperCase());\n const thisName = sanitiseField(typeName).replace(/^\\w/, (c) => c.toUpperCase());\n newName = parentName + thisName;\n type = parent;\n } while (type !== null && generatedSet.has(newName));\n return newName;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"jsonGen.js","sourceRoot":"","sources":["../../../src/json/walker/jsonGen.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport _ from 'lodash';\nimport { ConnectorWriter, JsonArray, JsonContext, JsonObj, JsonScalar, JsonType, StringWriter } from '../index.js';\nimport { trace, warn } from './log/trace.js';\nimport { sanitiseField } from './naming.js';\n\nexport class JsonGen {\n private readonly context: JsonContext;\n\n // Private constructor\n private constructor() {\n this.context = new JsonContext();\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n public static new(): JsonGen {\n return new JsonGen();\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string): JsonGen {\n const walker = new JsonGen();\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[]): JsonGen {\n const walker = new JsonGen();\n for (const json of jsons) {\n walker.walkJson(json);\n }\n return walker;\n }\n\n public generateSchema(): string {\n const writer = new StringWriter();\n ConnectorWriter.write(this, writer);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(): string {\n const writer = new StringWriter();\n this.context.setIndent(6);\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n root.select(this.context, writer);\n }\n\n return writer.flush();\n }\n\n // Writes all types in order using the provided Writer\n public writeTypes(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n const orderedSet = new Set<JsonType>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((t) => {\n // Assumes t is an Obj\n const obj = t as unknown as JsonObj;\n let typeName = obj.getType();\n if (generatedSet.has(typeName)) {\n // If same type, skip generation\n if (_.isEqual(obj, generatedSet.get(typeName))) {\n return;\n }\n obj.setType(JsonGen.generateNewObjType(generatedSet, t, typeName));\n typeName = obj.getType();\n }\n t.write(this.context, writer);\n generatedSet.set(typeName, t);\n });\n\n console.log('orderedSet =', Array.from(orderedSet));\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonType>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from((type as JsonObj).getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = (type as JsonArray).getArrayType();\n if (arrayType) {\n this.writeType(arrayType, orderedSet);\n }\n }\n }\n\n // Walk the JSON provided as a string\n public walkJson(json: string): void {\n const rootElement = JSON.parse(json);\n this.walkElement(this.context, null, 'root', rootElement);\n trace(this.context, ' [walkSource]', 'types found: ' + this.context.getTypes().length);\n }\n\n // Walk an element in the JSON tree\n private walkElement(context: JsonContext, parent: JsonType | null, name: string, element: any): JsonType {\n trace(context, '-> [walkElement]', 'in: ' + name);\n let result: JsonType;\n\n if (typeof element === 'object' && !Array.isArray(element) && element !== null) {\n // JSON object\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n } else if (Array.isArray(element)) {\n result = this.walkArray(context, parent, name, element);\n } else if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n result = this.walkPrimitive(context, parent, name, element);\n } else {\n throw new Error(\"Cannot yet handle '\" + name + \"' of type \" + typeof element);\n }\n\n trace(context, '<- [walkElement]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON object\n private walkObject(context: JsonContext, parent: JsonType | null, name: string, object: any): JsonObj {\n trace(context, '-> [walkObject]', 'in: ' + name);\n const result = new JsonObj(name, parent);\n const fieldSet = Object.keys(object);\n trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);\n\n for (const field of fieldSet) {\n trace(context, ' [walkObject]', 'field: ' + field);\n const childElement = object[field];\n const type = this.walkElement(context, result, field, childElement);\n result.add(field, type);\n }\n\n trace(context, '<- [walkObject]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON array\n private walkArray(context: JsonContext, parent: JsonType | null, name: string, array: any[]): JsonArray {\n trace(context, '-> [walkArray]', 'in: ' + name);\n const result = new JsonArray(name, parent);\n if (array.length > 0) {\n const firstElement = array[0];\n const arrayType = this.walkElement(context, parent, name, firstElement);\n result.setArrayType(arrayType);\n } else {\n warn(context, ' [walkArray]', \"Array is empty -- cannot derive type for field '\" + name + \"'\");\n }\n trace(context, '-> [walkArray]', 'in: ' + name);\n return result;\n }\n\n // Walk a primitive JSON value\n private walkPrimitive(_context: JsonContext, parent: JsonType | null, name: string, primitive: any): JsonScalar {\n let result: JsonScalar;\n if (typeof primitive === 'string') {\n result = new JsonScalar(name, parent, 'String');\n } else if (typeof primitive === 'boolean') {\n result = new JsonScalar(name, parent, 'Boolean');\n } else if (typeof primitive === 'number') {\n result = new JsonScalar(name, parent, 'Int');\n } else {\n throw new Error('Cannot yet handle primitive: ' + primitive);\n }\n return result;\n }\n\n // Utility method for naming conflict resolution\n private static generateNewObjType(generatedSet: Map<string, JsonType>, t: JsonType, typeName: string): string {\n let newName: string;\n let type: JsonType | null = t;\n do {\n const parent: JsonType | null = type.getParent();\n const parentName = parent === null ? '' : sanitiseField(parent.getName()).replace(/^\\w/, (c) => c.toUpperCase());\n const thisName = sanitiseField(typeName).replace(/^\\w/, (c) => c.toUpperCase());\n newName = parentName + thisName;\n type = parent;\n } while (type !== null && generatedSet.has(newName));\n return newName;\n }\n}\n"]}
|
|
@@ -22,7 +22,7 @@ export class JsonArray extends JsonType {
|
|
|
22
22
|
writer.write('### NO TYPE FOUND -- FIX MANUALLY! field: ' + field + ': [String]\n');
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
|
-
writer.write(
|
|
25
|
+
writer.write(context.getIndent());
|
|
26
26
|
writer.write(field);
|
|
27
27
|
writer.write(': [');
|
|
28
28
|
if (itemsType instanceof JsonScalar) {
|
|
@@ -49,7 +49,7 @@ export class JsonArray extends JsonType {
|
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
51
|
const fieldName = sanitiseFieldForSelect(this.getName());
|
|
52
|
-
writer.write(
|
|
52
|
+
writer.write(context.getIndent());
|
|
53
53
|
writer.write(fieldName);
|
|
54
54
|
writer.write('\n');
|
|
55
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonArray.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAIjF,MAAM,OAAO,SAAU,SAAQ,QAAQ;IAC7B,SAAS,GAAoB,IAAI,CAAC;IAE1C,YAAY,IAAY,EAAE,MAAuB;QAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtB,CAAC;IAEM,YAAY,CAAC,IAAc;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,OAAoB,EAAE,MAAe;QAChD,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEtC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,4CAA4C,GAAG,KAAK,GAAG,cAAc,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"jsonArray.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonArray.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace } from '../log/trace.js';\nimport { JsonType } from './jsonType.js';\nimport { JsonScalar } from './jsonScalar.js';\nimport { JsonObj } from './jsonObj.js';\nimport { JsonContext } from '../jsonContext.js';\nimport { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';\nimport { IWriter } from '../../io/writer.js';\nimport _ from 'lodash';\n\nexport class JsonArray extends JsonType {\n private arrayType: JsonType | null = null;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n }\n\n public setArrayType(type: JsonType): void {\n this.arrayType = type;\n }\n\n public getArrayType(): JsonType | null {\n return this.arrayType;\n }\n\n public write(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:write]', '-> in: ' + this.getName());\n const field = sanitiseField(this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType === null) {\n writer.write('### NO TYPE FOUND -- FIX MANUALLY! field: ' + field + ': [String]\\n');\n return;\n }\n\n writer.write(context.getIndent());\n writer.write(field);\n writer.write(': [');\n\n if (itemsType instanceof JsonScalar) {\n writer.write(itemsType.getType());\n } else if (itemsType instanceof JsonObj) {\n writer.write(itemsType.getType());\n } else {\n writer.write(upperFirst(itemsType.getName()));\n }\n\n writer.write(']');\n\n if (this.getName() !== field) {\n writer.write(' # ' + this.getName());\n }\n\n writer.write('\\n');\n trace(context, '[array:write]', '<- out: ' + this.getName());\n }\n\n public select(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:select]', '-> in: ' + this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType instanceof JsonObj) {\n itemsType.select(context, writer);\n } else {\n const fieldName = sanitiseFieldForSelect(this.getName());\n writer.write(context.getIndent());\n writer.write(fieldName);\n writer.write('\\n');\n }\n\n trace(context, '[array:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return this.id() + '[' + (this.getArrayType() ? this.getArrayType()!.getName() : 'undefined') + ']';\n }\n\n public id(): string {\n return 'array:#' + super.id();\n }\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { JsonType } from './jsonType.js';
|
|
1
|
+
import { JsonType, Context } from './jsonType.js';
|
|
3
2
|
import { IWriter } from '../../io/index.js';
|
|
4
3
|
export declare class JsonObj extends JsonType {
|
|
5
4
|
private type;
|
|
@@ -10,8 +9,8 @@ export declare class JsonObj extends JsonType {
|
|
|
10
9
|
getFields(): Map<string, JsonType>;
|
|
11
10
|
getType(): string;
|
|
12
11
|
setType(type: string): void;
|
|
13
|
-
write(context:
|
|
14
|
-
select(context:
|
|
12
|
+
write(context: Context, writer: IWriter): void;
|
|
13
|
+
select(context: Context, writer: IWriter): void;
|
|
15
14
|
toString(): string;
|
|
16
15
|
id(): string;
|
|
17
16
|
}
|
|
@@ -34,13 +34,13 @@ export class JsonObj extends JsonType {
|
|
|
34
34
|
for (const field of this.fields.values()) {
|
|
35
35
|
if (field instanceof JsonObj) {
|
|
36
36
|
const name = sanitiseField(field.getName());
|
|
37
|
-
writer.write(
|
|
37
|
+
writer.write(context.getIndent() + name + ': ' + field.getType() + '\n');
|
|
38
38
|
}
|
|
39
39
|
else {
|
|
40
40
|
field.write(context, writer);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
writer.write('}\n\n');
|
|
43
|
+
writer.write(context.getIndentWith(1) + '}\n\n');
|
|
44
44
|
context.leave(this);
|
|
45
45
|
trace(context, '[obj:write]', '<- out: ' + this.getType());
|
|
46
46
|
}
|
|
@@ -50,13 +50,13 @@ export class JsonObj extends JsonType {
|
|
|
50
50
|
trace(context, '[obj:select]', '-> in: ' + this.getName());
|
|
51
51
|
context.enter(this);
|
|
52
52
|
if (this.getParent() !== null) {
|
|
53
|
-
writer.write(
|
|
53
|
+
writer.write(context.getIndentWith(1) + sanitiseFieldForSelect(this.getName()) + ' {\n');
|
|
54
54
|
}
|
|
55
55
|
for (const field of this.fields.values()) {
|
|
56
56
|
field.select(context, writer);
|
|
57
57
|
}
|
|
58
58
|
if (this.getParent() !== null) {
|
|
59
|
-
writer.write(
|
|
59
|
+
writer.write(context.getIndentWith(1) + '}\n');
|
|
60
60
|
}
|
|
61
61
|
context.leave(this);
|
|
62
62
|
trace(context, '[obj:select]', '<- out: ' + this.getName());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonObj.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonObj.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsonObj.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonObj.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace } from '../log/trace.js';\nimport { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';\nimport { JsonType, Context } from './jsonType.js';\nimport { IWriter } from '../../io/index.js';\nimport _ from 'lodash';\n\nexport class JsonObj extends JsonType {\n private type: string;\n private fields: Map<string, JsonType>;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n this.type = JsonObj.generateType(parent, name);\n this.fields = new Map<string, JsonType>();\n }\n\n private static generateType(parent: JsonType | null, name: string): string {\n const parentName = parent === null ? '' : upperFirst(sanitiseField(parent.getName()));\n return parentName + upperFirst(sanitiseField(name));\n }\n\n public add(field: string, type: JsonType): void {\n this.fields.set(field, type);\n }\n\n public getFields(): Map<string, JsonType> {\n return this.fields;\n }\n\n public getType(): string {\n return this.type;\n }\n\n public setType(type: string): void {\n this.type = type;\n }\n\n public write(context: Context, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:write]', '-> in: ' + this.getType());\n context.enter(this);\n writer.write('type ' + this.getType() + ' {\\n');\n\n for (const field of this.fields.values()) {\n if (field instanceof JsonObj) {\n const name = sanitiseField(field.getName());\n writer.write(context.getIndent() + name + ': ' + field.getType() + '\\n');\n } else {\n field.write(context, writer);\n }\n }\n\n writer.write(context.getIndentWith(1) + '}\\n\\n');\n context.leave(this);\n trace(context, '[obj:write]', '<- out: ' + this.getType());\n }\n\n public select(context: Context, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:select]', '-> in: ' + this.getName());\n context.enter(this);\n\n if (this.getParent() !== null) {\n writer.write(context.getIndentWith(1) + sanitiseFieldForSelect(this.getName()) + ' {\\n');\n }\n\n for (const field of this.fields.values()) {\n field.select(context, writer);\n }\n\n if (this.getParent() !== null) {\n writer.write(context.getIndentWith(1) + '}\\n');\n }\n\n context.leave(this);\n trace(context, '[obj:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return 'obj:' + this.getName() + ':{' + Array.from(this.fields.keys()).join(',') + '}';\n }\n\n public id(): string {\n return 'obj:#' + super.id();\n }\n}\n"]}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { JsonType } from './jsonType.js';
|
|
1
|
+
import { JsonType, Context } from './jsonType.js';
|
|
3
2
|
import { IWriter } from '../../io/writer.js';
|
|
4
3
|
export declare class JsonScalar extends JsonType {
|
|
5
4
|
private readonly type;
|
|
6
5
|
constructor(name: string, parent: JsonType | null, type: string);
|
|
7
6
|
getType(): string;
|
|
8
|
-
write(context:
|
|
9
|
-
select(context:
|
|
7
|
+
write(context: Context, writer: IWriter): void;
|
|
8
|
+
select(context: Context, writer: IWriter): void;
|
|
10
9
|
toString(): string;
|
|
11
10
|
id(): string;
|
|
12
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { JsonType } from './jsonType.js';
|
|
1
2
|
import { trace } from '../log/trace.js';
|
|
2
3
|
import { sanitiseField, sanitiseFieldForSelect } from '../naming.js';
|
|
3
|
-
import { JsonType } from './jsonType.js';
|
|
4
4
|
export class JsonScalar extends JsonType {
|
|
5
5
|
type;
|
|
6
6
|
constructor(name, parent, type) {
|
|
@@ -14,7 +14,7 @@ export class JsonScalar extends JsonType {
|
|
|
14
14
|
const name = this.getName();
|
|
15
15
|
const isProtectedName = this.protectedName;
|
|
16
16
|
trace(context, '[scalar:write]', '-> in: ' + name);
|
|
17
|
-
writer.write(
|
|
17
|
+
writer.write(context.getIndent());
|
|
18
18
|
const field = isProtectedName ? '_value' : sanitiseField(name);
|
|
19
19
|
writer.write(field);
|
|
20
20
|
writer.write(': ');
|
|
@@ -27,7 +27,7 @@ export class JsonScalar extends JsonType {
|
|
|
27
27
|
}
|
|
28
28
|
select(context, writer) {
|
|
29
29
|
trace(context, '[scalar:select]', '-> in: ' + this.getName());
|
|
30
|
-
writer.write(
|
|
30
|
+
writer.write(context.getIndent());
|
|
31
31
|
if (!this.protectedName) {
|
|
32
32
|
const originalName = this.getName();
|
|
33
33
|
const fieldName = sanitiseFieldForSelect(originalName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonScalar.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonScalar.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsonScalar.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonScalar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAW,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACrB,IAAI,CAAS;IAE9B,YAAY,IAAY,EAAE,MAAuB,EAAE,IAAY;QAC7D,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,OAAgB,EAAE,MAAe;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC;QAE3C,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE7B,8CAA8C;QAC9C,IAAI,eAAe;YAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,kEAAkE,CAAC,CAAC;QAEjH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,OAAgB,EAAE,MAAe;QAC7C,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAElC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnB,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;IAChD,CAAC;IAEM,EAAE;QACP,OAAO,UAAU,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;IACjC,CAAC;CACF","sourcesContent":["import { JsonType, Context } from './jsonType.js';\nimport { IWriter } from '../../io/writer.js';\nimport { trace } from '../log/trace.js';\nimport { sanitiseField, sanitiseFieldForSelect } from '../naming.js';\n\nexport class JsonScalar extends JsonType {\n private readonly type: string;\n\n constructor(name: string, parent: JsonType | null, type: string) {\n super(name, parent);\n this.type = type;\n }\n\n public getType(): string {\n return this.type;\n }\n\n public write(context: Context, writer: IWriter): void {\n const name = this.getName();\n const isProtectedName = this.protectedName;\n\n trace(context, '[scalar:write]', '-> in: ' + name);\n writer.write(context.getIndent());\n\n const field = isProtectedName ? '_value' : sanitiseField(name);\n writer.write(field);\n\n writer.write(': ');\n writer.write(this.getType());\n\n // add a comment that you cannot use that name\n if (isProtectedName) writer.write(` # '${name}' cannot be used as a field name, it's been replaced by '_value'`);\n\n writer.write('\\n');\n trace(context, '[scalar:write]', '<- out: ' + name);\n }\n\n public select(context: Context, writer: IWriter): void {\n trace(context, '[scalar:select]', '-> in: ' + this.getName());\n\n writer.write(context.getIndent());\n\n if (!this.protectedName) {\n const originalName = this.getName();\n const fieldName = sanitiseFieldForSelect(originalName);\n writer.write(fieldName);\n } else {\n writer.write(`_value: ${this.getName()}`);\n }\n\n writer.write('\\n');\n\n trace(context, '[scalar:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return this.id() + '{' + this.getType() + '}';\n }\n\n public id(): string {\n return 'scalar:#' + super.id();\n }\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { IWriter } from '../../io/index.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
2
|
+
import { JsonContext } from '../jsonContext.js';
|
|
3
|
+
export type Context = JsonContext;
|
|
5
4
|
export declare abstract class JsonType {
|
|
6
5
|
private readonly name;
|
|
7
6
|
private readonly parent;
|
|
@@ -10,8 +9,6 @@ export declare abstract class JsonType {
|
|
|
10
9
|
getName(): string;
|
|
11
10
|
getParent(): JsonType | null;
|
|
12
11
|
abstract write(context: Context, writer: IWriter): void;
|
|
13
|
-
protected indent(context: Context): string;
|
|
14
|
-
protected indentWith(context: Context, subtract: number): string;
|
|
15
12
|
abstract select(context: Context, writer: IWriter): void;
|
|
16
13
|
id(): string;
|
|
17
14
|
}
|
|
@@ -15,12 +15,6 @@ export class JsonType {
|
|
|
15
15
|
getParent() {
|
|
16
16
|
return this.parent;
|
|
17
17
|
}
|
|
18
|
-
indent(context) {
|
|
19
|
-
return ' '.repeat(context.getStack().length);
|
|
20
|
-
}
|
|
21
|
-
indentWith(context, subtract) {
|
|
22
|
-
return ' '.repeat(context.getStack().length - subtract);
|
|
23
|
-
}
|
|
24
18
|
id() {
|
|
25
19
|
let paths = '';
|
|
26
20
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonType.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonType.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK3C,MAAM,OAAgB,QAAQ;IACX,IAAI,CAAS;IACb,MAAM,CAAkB;IAEzC,wDAAwD;IACrC,aAAa,CAAU;IAE1C,YAAY,IAAY,EAAE,MAAuB;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAMM,EAAE;QACP,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,4DAA4D;QAC5D,IAAI,MAAM,GAAoB,IAAI,CAAC;QACnC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;CACF","sourcesContent":["import { IWriter } from '../../io/index.js';\nimport { isProtected } from '../naming.js';\nimport { JsonContext } from '../jsonContext.js';\n\nexport type Context = JsonContext;\n\nexport abstract class JsonType {\n private readonly name: string;\n private readonly parent: JsonType | null;\n\n // if the name is a protected name and should be escaped\n protected readonly protectedName: boolean;\n\n constructor(name: string, parent: JsonType | null) {\n this.name = name;\n this.parent = parent;\n this.protectedName = isProtected(name);\n }\n\n public getName(): string {\n return this.name;\n }\n\n public getParent(): JsonType | null {\n return this.parent;\n }\n\n public abstract write(context: Context, writer: IWriter): void;\n\n public abstract select(context: Context, writer: IWriter): void;\n\n public id(): string {\n let paths = '';\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: JsonType | null = this;\n while ((parent = parent.getParent()) !== null) {\n paths = `/${parent.getName()}` + paths;\n }\n return paths + '/' + this.getName();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apollo-conn-gen",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Library to generate Apollo connector schemas from OpenAPI specs or JSON payloads. Also includes a CLI to generate connectors from the command line.",
|
|
5
5
|
"author": "Fernando @ Apollo",
|
|
6
6
|
"license": "MIT",
|