@powerhousedao/codegen 0.36.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/cli.js +0 -78
  2. package/dist/create-lib/index.js +0 -7
  3. package/dist/index.d.ts +4 -6
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -4
  6. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts +25 -0
  7. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts.map +1 -0
  8. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js +60 -0
  9. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts +24 -0
  10. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts.map +1 -0
  11. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +25 -0
  12. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/index.d.ts +22 -0
  13. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/index.d.ts.map +1 -0
  14. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/index.js +19 -0
  15. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts +21 -0
  16. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts.map +1 -0
  17. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +13 -0
  18. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts +14 -0
  19. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts.map +1 -0
  20. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js +8 -0
  21. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts +21 -0
  22. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts.map +1 -0
  23. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js +13 -0
  24. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.d.ts +20 -0
  25. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.d.ts.map +1 -0
  26. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.js +13 -0
  27. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts +16 -0
  28. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts.map +1 -0
  29. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js +9 -0
  30. package/dist/src/codegen/graphql.d.ts +16 -0
  31. package/dist/src/codegen/graphql.d.ts.map +1 -0
  32. package/dist/src/codegen/graphql.js +91 -0
  33. package/dist/src/codegen/hygen.d.ts +23 -0
  34. package/dist/src/codegen/hygen.d.ts.map +1 -0
  35. package/dist/src/codegen/hygen.js +162 -0
  36. package/dist/src/codegen/index.d.ts +13 -0
  37. package/dist/src/codegen/index.d.ts.map +1 -0
  38. package/dist/src/codegen/index.js +123 -0
  39. package/dist/src/codegen/utils.d.ts +4 -0
  40. package/dist/src/codegen/utils.d.ts.map +1 -0
  41. package/dist/src/codegen/utils.js +40 -0
  42. package/dist/src/create-lib/create-project.d.ts +25 -0
  43. package/dist/src/create-lib/create-project.d.ts.map +1 -0
  44. package/dist/src/create-lib/create-project.js +158 -0
  45. package/dist/src/create-lib/index.d.ts +2 -0
  46. package/dist/src/create-lib/index.d.ts.map +1 -0
  47. package/dist/src/create-lib/index.js +1 -0
  48. package/dist/src/utils/cli.d.ts +26 -0
  49. package/dist/src/utils/cli.d.ts.map +1 -0
  50. package/dist/src/utils/cli.js +56 -0
  51. package/dist/src/utils/index.d.ts +4 -0
  52. package/dist/src/utils/index.d.ts.map +1 -0
  53. package/dist/src/utils/index.js +3 -0
  54. package/dist/src/utils/mock.d.ts +4 -0
  55. package/dist/src/utils/mock.d.ts.map +1 -0
  56. package/dist/src/utils/mock.js +4 -0
  57. package/dist/src/utils/package-manager.d.ts +5 -0
  58. package/dist/src/utils/package-manager.d.ts.map +1 -0
  59. package/dist/src/utils/package-manager.js +16 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -0
  61. package/package.json +12 -19
  62. package/dist/cli.d.ts +0 -1
  63. package/dist/cli.js.map +0 -1
  64. package/dist/codegen/.hygen/templates/package.json +0 -3
  65. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/actions.esm.t +0 -16
  66. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/creators.esm.t +0 -8
  67. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/customUtils.esm.t +0 -5
  68. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/documentModel.esm.t +0 -7
  69. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/documentModelTest.esm.t +0 -25
  70. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/index.esm.t +0 -9
  71. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/index.js +0 -73
  72. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/index.js.map +0 -1
  73. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/lib.esm.t +0 -9
  74. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/lib.inject_export.esm.t +0 -7
  75. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/object.esm.t +0 -49
  76. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +0 -35
  77. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/rootIndex.esm.t +0 -41
  78. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/schema.esm.t +0 -6
  79. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +0 -19
  80. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +0 -43
  81. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/actions.esm.t +0 -22
  82. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/creators.esm.t +0 -34
  83. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/customReducers.esm.t +0 -20
  84. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/customTest.esm.t +0 -53
  85. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/error.esm.t +0 -40
  86. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +0 -33
  87. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +0 -1
  88. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/object.esm.t +0 -37
  89. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-module/operations.esm.t +0 -17
  90. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/index.js +0 -25
  91. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/index.js.map +0 -1
  92. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/resolvers.esm.t +0 -62
  93. package/dist/codegen/.hygen/templates/powerhouse/generate-document-model-mutations/schema.esm.t +0 -31
  94. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/editor.esm.t +0 -23
  95. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/index.esm.t +0 -22
  96. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/index.js +0 -17
  97. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/index.js.map +0 -1
  98. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/lib.esm.t +0 -9
  99. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/lib.inject_export.esm.t +0 -7
  100. package/dist/codegen/.hygen/templates/powerhouse/generate-editor/story.esm.t +0 -31
  101. package/dist/codegen/.hygen/templates/powerhouse/generate-import-script/index.esm.t +0 -59
  102. package/dist/codegen/.hygen/templates/powerhouse/generate-import-script/index.js +0 -14
  103. package/dist/codegen/.hygen/templates/powerhouse/generate-import-script/index.js.map +0 -1
  104. package/dist/codegen/.hygen/templates/powerhouse/generate-import-script/utils.esm.t +0 -100
  105. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.esm.t +0 -66
  106. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js +0 -17
  107. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js.map +0 -1
  108. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +0 -9
  109. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.inject_export.esm.t +0 -7
  110. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.esm.t +0 -62
  111. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.js +0 -17
  112. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.js.map +0 -1
  113. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-operational/lib.esm.t +0 -9
  114. package/dist/codegen/.hygen/templates/powerhouse/generate-processor-operational/lib.inject_export.esm.t +0 -8
  115. package/dist/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +0 -61
  116. package/dist/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js +0 -15
  117. package/dist/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js.map +0 -1
  118. package/dist/codegen/.hygen/templates/powerhouse/generate-subgraph/lib.esm.t +0 -9
  119. package/dist/codegen/.hygen/templates/powerhouse/generate-subgraph/lib.inject_export.esm.t +0 -7
  120. package/dist/codegen/graphql.js +0 -97
  121. package/dist/codegen/graphql.js.map +0 -1
  122. package/dist/codegen/hygen.js +0 -179
  123. package/dist/codegen/hygen.js.map +0 -1
  124. package/dist/codegen/index.js +0 -146
  125. package/dist/codegen/index.js.map +0 -1
  126. package/dist/codegen/utils.js +0 -38
  127. package/dist/codegen/utils.js.map +0 -1
  128. package/dist/create-lib/index.js.map +0 -1
  129. package/dist/create-lib/init.js +0 -182
  130. package/dist/create-lib/init.js.map +0 -1
  131. package/dist/create-lib/utils.js +0 -19
  132. package/dist/create-lib/utils.js.map +0 -1
  133. package/dist/create-lib.d.ts +0 -1
  134. package/dist/graphql.d.ts +0 -18
  135. package/dist/hygen.d.ts +0 -28
  136. package/dist/index-DT1dkT-t.d.ts +0 -15
  137. package/dist/index.js.map +0 -1
  138. package/dist/utils/cli.js +0 -61
  139. package/dist/utils/cli.js.map +0 -1
  140. package/dist/utils/index.js +0 -6
  141. package/dist/utils/index.js.map +0 -1
  142. package/dist/utils/mock.js +0 -9
  143. package/dist/utils/mock.js.map +0 -1
  144. package/dist/utils.d.ts +0 -59
@@ -0,0 +1,162 @@
1
+ import fs from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Logger, runner } from "hygen";
6
+ import { loadDocumentModel } from "./utils.js";
7
+ import { pascalCase } from "change-case";
8
+ const require = createRequire(import.meta.url);
9
+ const __dirname = import.meta.dirname || path.dirname(fileURLToPath(import.meta.url));
10
+ const logger = new Logger(console.log.bind(console));
11
+ const defaultTemplates = path.join(__dirname, ".hygen", "templates");
12
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+ async function run(args, { watch = false, skipFormat = false } = {}) {
14
+ const result = await runner(args, {
15
+ templates: defaultTemplates,
16
+ cwd: process.cwd(),
17
+ logger,
18
+ createPrompter: () => {
19
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
20
+ return require("enquirer");
21
+ },
22
+ exec: (action, body) => {
23
+ const opts = body && body.length > 0 ? { input: body } : {};
24
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
25
+ return require("execa").shell(action, opts);
26
+ },
27
+ debug: !!process.env.DEBUG,
28
+ });
29
+ if (!skipFormat) {
30
+ const execa = await import("execa");
31
+ const actions = result.actions;
32
+ actions
33
+ .filter((action) => ["added", "inject"].includes(action.status))
34
+ .forEach((action) => {
35
+ execa.$ `prettier --ignore-path --write ${action.subject.replace(".", process.cwd())}`.catch((err) => {
36
+ console.log(err);
37
+ });
38
+ });
39
+ }
40
+ return result;
41
+ }
42
+ export async function generateAll(dir, { watch = false, skipFormat = false } = {}) {
43
+ const files = fs.readdirSync(dir, { withFileTypes: true });
44
+ for (const directory of files.filter((f) => f.isDirectory())) {
45
+ const documentModelPath = path.join(dir, directory.name, `${directory.name}.json`);
46
+ if (!fs.existsSync(documentModelPath)) {
47
+ continue;
48
+ }
49
+ try {
50
+ const documentModel = await loadDocumentModel(documentModelPath);
51
+ await generateDocumentModel(documentModel, dir, { watch, skipFormat });
52
+ }
53
+ catch (error) {
54
+ console.error(directory.name, error);
55
+ }
56
+ }
57
+ }
58
+ export async function generateDocumentModel(documentModelState, dir, { watch = false, skipFormat = false } = {}) {
59
+ // Generate the singular files for the document model logic
60
+ await run([
61
+ "powerhouse",
62
+ "generate-document-model",
63
+ "--document-model",
64
+ JSON.stringify(documentModelState),
65
+ "--root-dir",
66
+ dir,
67
+ ], { watch, skipFormat });
68
+ const latestSpec = documentModelState.specifications[documentModelState.specifications.length - 1];
69
+ // Generate the module-specific files for the document model logic
70
+ for (const module of latestSpec.modules) {
71
+ await run([
72
+ "powerhouse",
73
+ "generate-document-model-module",
74
+ "--document-model",
75
+ JSON.stringify(documentModelState),
76
+ "--root-dir",
77
+ dir,
78
+ "--module",
79
+ module.name,
80
+ ], { watch, skipFormat });
81
+ }
82
+ }
83
+ export async function generateEditor(name, documentTypes, documentTypesMap, dir, documentModelsDir, { skipFormat = false } = {}) {
84
+ // Generate the singular files for the document model logic
85
+ await run([
86
+ "powerhouse",
87
+ "generate-editor",
88
+ "--name",
89
+ name,
90
+ "--root-dir",
91
+ dir,
92
+ "--document-types",
93
+ documentTypes.join(","),
94
+ "--document-types-map",
95
+ JSON.stringify(documentTypesMap),
96
+ "--document-models-dir",
97
+ documentModelsDir,
98
+ ], { skipFormat });
99
+ }
100
+ export async function generateProcessor(name, documentTypes, documentTypesMap, dir, documentModelsDir, type = "analytics", { skipFormat = false } = {}) {
101
+ // Generate the singular files for the document model logic
102
+ const processorType = type === "operational" ? "operational" : "analytics";
103
+ await run([
104
+ "powerhouse",
105
+ `generate-processor-${processorType}`,
106
+ "--name",
107
+ name,
108
+ "--pascalName",
109
+ pascalCase(name),
110
+ "--root-dir",
111
+ dir,
112
+ "--document-types",
113
+ documentTypes.join(","),
114
+ "--document-types-map",
115
+ JSON.stringify(documentTypesMap),
116
+ "--document-models-dir",
117
+ documentModelsDir,
118
+ ], { skipFormat });
119
+ }
120
+ export async function generateSubgraph(name, documentModel, dir, { skipFormat = false } = {}) {
121
+ const params = [
122
+ "powerhouse",
123
+ `generate-subgraph`,
124
+ "--name",
125
+ name,
126
+ "--pascalName",
127
+ pascalCase(name),
128
+ "--root-dir",
129
+ dir,
130
+ ];
131
+ if (documentModel) {
132
+ params.push("--loadFromFile", "1");
133
+ }
134
+ // Generate the singular files for the document model logic
135
+ await run(params, { skipFormat });
136
+ if (documentModel) {
137
+ // Generate the GraphQL mutation schemas
138
+ await run([
139
+ "powerhouse",
140
+ "generate-document-model-mutations",
141
+ "--subgraph",
142
+ name,
143
+ "--document-model",
144
+ JSON.stringify(documentModel),
145
+ "--root-dir",
146
+ dir,
147
+ ], { skipFormat });
148
+ }
149
+ }
150
+ export async function generateImportScript(name, dir, { skipFormat = false } = {}) {
151
+ // Generate the singular files for the document model logic
152
+ await run([
153
+ "powerhouse",
154
+ `generate-import-script`,
155
+ "--name",
156
+ name,
157
+ "--pascalName",
158
+ pascalCase(name),
159
+ "--root-dir",
160
+ dir,
161
+ ], { skipFormat });
162
+ }
@@ -0,0 +1,13 @@
1
+ #! /usr/bin/env node
2
+ import { PowerhouseConfig } from "@powerhousedao/config/powerhouse";
3
+ export type DocumentTypesMap = Record<string, {
4
+ name: string;
5
+ importPath: string;
6
+ }>;
7
+ export declare function generate(config: PowerhouseConfig): Promise<void>;
8
+ export declare function generateFromFile(path: string, config: PowerhouseConfig): Promise<void>;
9
+ export declare function generateEditor(name: string, documentTypes: string[], config: PowerhouseConfig): Promise<void>;
10
+ export declare function generateSubgraph(name: string, file: string | null, config: PowerhouseConfig): Promise<void>;
11
+ export declare function generateProcessor(name: string, type: "analytics" | "operational", documentTypes: string[], config: PowerhouseConfig): Promise<void>;
12
+ export declare function generateImportScript(name: string, config: PowerhouseConfig): Promise<void>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/codegen/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AA4CpE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CACnC,MAAM,EACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CACrC,CAAC;AAyDF,wBAAsB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,iBAItD;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,iBA4B5E;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,gBAAgB,iBAwBzB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,gBAAgB,iBAQzB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAAG,aAAa,EACjC,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,gBAAgB,iBAqBzB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,iBAGzB"}
@@ -0,0 +1,123 @@
1
+ #! /usr/bin/env node
2
+ import { typeDefs } from "@powerhousedao/scalars";
3
+ import { paramCase, pascalCase } from "change-case";
4
+ import fs from "node:fs";
5
+ import { join, resolve } from "path";
6
+ import { generateSchema, generateSchemas } from "./graphql.js";
7
+ import { generateEditor as _generateEditor, generateImportScript as _generateImportScript, generateProcessor as _generateProcessor, generateSubgraph as _generateSubgraph, generateAll, generateDocumentModel, } from "./hygen.js";
8
+ import { loadDocumentModel } from "./utils.js";
9
+ function generateGraphqlSchema(documentModel) {
10
+ const spec = documentModel.specifications[documentModel.specifications.length - 1];
11
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
12
+ if (!spec) {
13
+ throw new Error(`No spec found for ${documentModel.id}`);
14
+ }
15
+ const { modules, state: { global, local }, } = spec;
16
+ const schemas = [
17
+ global.schema,
18
+ local.schema,
19
+ ...modules
20
+ .map((module) => [
21
+ `# ${module.name}`,
22
+ ...module.operations.map((op) => op.schema),
23
+ ])
24
+ .flat()
25
+ .filter((schema) => schema && schema.length > 0),
26
+ ];
27
+ return schemas.join("\n\n");
28
+ }
29
+ // returns map of document model id to document model name in pascal case and import path
30
+ async function getDocumentTypesMap(dir, pathOrigin = "../../../") {
31
+ const documentTypesMap = {};
32
+ // add document types from provided dir
33
+ if (fs.existsSync(dir)) {
34
+ fs.readdirSync(dir, { withFileTypes: true })
35
+ .filter((dirent) => dirent.isDirectory())
36
+ .map((dirent) => dirent.name)
37
+ .forEach((name) => {
38
+ const specPath = resolve(dir, name, `${name}.json`);
39
+ if (!fs.existsSync(specPath)) {
40
+ return;
41
+ }
42
+ const specRaw = fs.readFileSync(specPath, "utf-8");
43
+ try {
44
+ const spec = JSON.parse(specRaw);
45
+ if (spec.id) {
46
+ documentTypesMap[spec.id] = {
47
+ name: pascalCase(name),
48
+ importPath: join(pathOrigin, dir, name),
49
+ };
50
+ }
51
+ }
52
+ catch {
53
+ console.error(`Failed to parse ${specPath}`);
54
+ }
55
+ });
56
+ }
57
+ // add documents from document-model-libs if lib is installed
58
+ try {
59
+ /* eslint-disable */
60
+ // @ts-ignore-error TS2307 this import is expected to fail if document-model-libs is not available
61
+ const documentModels = await import("document-model-libs/document-models");
62
+ Object.keys(documentModels).forEach((name) => {
63
+ const documentModel = documentModels[name];
64
+ documentTypesMap[documentModel.documentModel.id] = {
65
+ name,
66
+ importPath: `document-model-libs/${paramCase(name)}`,
67
+ };
68
+ });
69
+ /* eslint-enable */
70
+ }
71
+ catch {
72
+ /* document-model-libs is not available */
73
+ }
74
+ return documentTypesMap;
75
+ }
76
+ export async function generate(config) {
77
+ const { skipFormat, watch } = config;
78
+ await generateSchemas(config.documentModelsDir, { skipFormat, watch });
79
+ await generateAll(config.documentModelsDir, { skipFormat, watch });
80
+ }
81
+ export async function generateFromFile(path, config) {
82
+ // load document model spec from file
83
+ const documentModel = await loadDocumentModel(path);
84
+ const name = paramCase(documentModel.name);
85
+ // create document model folder and spec as json
86
+ fs.mkdirSync(join(config.documentModelsDir, name), { recursive: true });
87
+ fs.writeFileSync(join(config.documentModelsDir, name, `${name}.json`), JSON.stringify(documentModel, null, 4));
88
+ // bundle graphql schemas together
89
+ const schemaStr = [
90
+ typeDefs.join("\n"), // inject ph scalars
91
+ generateGraphqlSchema(documentModel),
92
+ ].join("\n");
93
+ if (schemaStr) {
94
+ fs.writeFileSync(join(config.documentModelsDir, name, `schema.graphql`), schemaStr);
95
+ }
96
+ await generateSchema(name, config.documentModelsDir, config);
97
+ await generateDocumentModel(documentModel, config.documentModelsDir, config);
98
+ }
99
+ export async function generateEditor(name, documentTypes, config) {
100
+ const pathOrigin = "../../";
101
+ const { documentModelsDir, skipFormat } = config;
102
+ const documentTypesMap = await getDocumentTypesMap(documentModelsDir, pathOrigin);
103
+ const invalidType = documentTypes.find((type) => !Object.keys(documentTypesMap).includes(type));
104
+ if (invalidType) {
105
+ throw new Error(`Document model for ${invalidType} not found`);
106
+ }
107
+ return _generateEditor(name, documentTypes, documentTypesMap, config.editorsDir, config.documentModelsDir, { skipFormat });
108
+ }
109
+ export async function generateSubgraph(name, file, config) {
110
+ return _generateSubgraph(name, file !== null ? await loadDocumentModel(file) : null, config.subgraphsDir, config);
111
+ }
112
+ export async function generateProcessor(name, type, documentTypes, config) {
113
+ const { documentModelsDir, skipFormat } = config;
114
+ const documentTypesMap = await getDocumentTypesMap(documentModelsDir);
115
+ const invalidType = documentTypes.find((type) => !Object.keys(documentTypesMap).includes(type));
116
+ if (invalidType) {
117
+ throw new Error(`Document model for ${invalidType} not found`);
118
+ }
119
+ return _generateProcessor(name, documentTypes, documentTypesMap, config.processorsDir, config.documentModelsDir, type, { skipFormat });
120
+ }
121
+ export async function generateImportScript(name, config) {
122
+ return _generateImportScript(name, config.importScriptsDir, config);
123
+ }
@@ -0,0 +1,4 @@
1
+ import { type DocumentModelState } from "document-model";
2
+ export declare function loadDocumentModel(path: string): Promise<DocumentModelState>;
3
+ export declare function formatWithPrettierBeforeWrite(outputFile: string, content: string): Promise<string>;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/codegen/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAIxB,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,CAAC,CA2B7B;AAED,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,mBAMhB"}
@@ -0,0 +1,40 @@
1
+ import { documentModelLoadFromFile, } from "document-model";
2
+ import fs from "node:fs";
3
+ import { format } from "prettier";
4
+ export async function loadDocumentModel(path) {
5
+ let documentModel;
6
+ try {
7
+ if (!path) {
8
+ throw new Error("Document model file not specified");
9
+ }
10
+ else if (path.endsWith(".zip")) {
11
+ const file = await documentModelLoadFromFile(path);
12
+ documentModel = file.state.global;
13
+ }
14
+ else if (path.endsWith(".json")) {
15
+ const data = fs.readFileSync(path, "utf-8");
16
+ const parsedData = JSON.parse(data);
17
+ if ("state" in parsedData) {
18
+ documentModel = parsedData.state.global;
19
+ }
20
+ else {
21
+ documentModel = parsedData;
22
+ }
23
+ }
24
+ else {
25
+ throw new Error("File type not supported. Must be zip or json.");
26
+ }
27
+ return documentModel;
28
+ }
29
+ catch (error) {
30
+ throw error.code === "MODULE_NOT_FOUND"
31
+ ? new Error(`Document model not found.`)
32
+ : error;
33
+ }
34
+ }
35
+ export async function formatWithPrettierBeforeWrite(outputFile, content) {
36
+ const modifiedContent = await format(content, {
37
+ parser: "typescript",
38
+ });
39
+ return modifiedContent;
40
+ }
@@ -0,0 +1,25 @@
1
+ export declare const createCommandSpec: {
2
+ readonly "--name": StringConstructor;
3
+ readonly "--project-name": "--name";
4
+ readonly "--version": StringConstructor;
5
+ readonly "--interactive": BooleanConstructor;
6
+ readonly "--dev": BooleanConstructor;
7
+ readonly "--staging": BooleanConstructor;
8
+ readonly "-p": "--name";
9
+ readonly "-v": "--version";
10
+ readonly "--package-manager": StringConstructor;
11
+ };
12
+ export interface ICreateProjectOptions {
13
+ name: string | undefined;
14
+ version: string;
15
+ interactive: boolean;
16
+ packageManager?: string;
17
+ }
18
+ export declare function parseVersion(args: {
19
+ version?: string;
20
+ dev?: boolean;
21
+ staging?: boolean;
22
+ }): string;
23
+ export declare function initCli(): Promise<void>;
24
+ export declare function createProject(options: ICreateProjectOptions): Promise<void>;
25
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../../src/create-lib/create-project.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAiED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,UAWA;AAUD,wBAAgB,OAAO,kBAQtB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,qBAAqB,iBAmDjE"}
@@ -0,0 +1,158 @@
1
+ import { parseArgs, promptDirectories } from "#utils/cli";
2
+ import { getPackageManager } from "#utils/package-manager";
3
+ import { execSync } from "child_process";
4
+ import enquirer from "enquirer";
5
+ import fs from "node:fs";
6
+ import path from "path";
7
+ const BOILERPLATE_REPO = "https://github.com/powerhouse-inc/document-model-boilerplate.git";
8
+ const envPackageManager = getPackageManager(process.env.npm_config_user_agent);
9
+ const defaultDirectories = {
10
+ documentModelsDir: "./document-models",
11
+ editorsDir: "./editors",
12
+ };
13
+ export const createCommandSpec = {
14
+ "--name": String,
15
+ "--project-name": "--name",
16
+ "--version": String,
17
+ "--interactive": Boolean,
18
+ "--dev": Boolean,
19
+ "--staging": Boolean,
20
+ "-p": "--name",
21
+ "-v": "--version",
22
+ "--package-manager": String,
23
+ };
24
+ const { prompt } = enquirer;
25
+ function buildPackageJson(appPath, projectName) {
26
+ const packageJson = JSON.parse(fs.readFileSync(path.join(appPath, "package.json"), "utf-8"));
27
+ const newPackage = {
28
+ ...packageJson,
29
+ name: projectName,
30
+ version: "1.0.0",
31
+ description: "",
32
+ };
33
+ fs.writeFileSync(path.join(appPath, "package.json"), JSON.stringify(newPackage, null, 2), "utf8");
34
+ }
35
+ function buildPowerhouseConfig(appPath, documentModelsDir, editorsDir) {
36
+ const filePath = path.join(appPath, "powerhouse.config.json");
37
+ const packageJson = JSON.parse(fs.readFileSync(filePath, "utf-8"));
38
+ const newPackage = {
39
+ ...packageJson,
40
+ documentModelsDir,
41
+ editorsDir,
42
+ };
43
+ fs.writeFileSync(filePath, JSON.stringify(newPackage, null, 2), "utf8");
44
+ }
45
+ function buildIndex(appPath, documentModelsDir, editorsDir) {
46
+ fs.writeFileSync(path.join(appPath, "index.ts"), `import * as documentModelsExports from '${documentModelsDir}';
47
+ import * as editorsExports from '${editorsDir}';
48
+
49
+ export const documentModels = Object.values(documentModelsExports);
50
+ export const editors = Object.values(editorsExports);`, "utf8");
51
+ }
52
+ function runCmd(command) {
53
+ try {
54
+ execSync(command, { stdio: "inherit" });
55
+ }
56
+ catch (error) {
57
+ console.log("\x1b[31m", error, "\x1b[0m");
58
+ }
59
+ }
60
+ export function parseVersion(args) {
61
+ if (args.version) {
62
+ return args.version;
63
+ }
64
+ if (args.dev) {
65
+ return "dev";
66
+ }
67
+ else if (args.staging) {
68
+ return "staging";
69
+ }
70
+ else {
71
+ return "main";
72
+ }
73
+ }
74
+ function parseVersionArgs(args) {
75
+ return parseVersion({
76
+ version: args["--version"],
77
+ dev: args["--dev"],
78
+ staging: args["--staging"],
79
+ });
80
+ }
81
+ export function initCli() {
82
+ const args = parseArgs(process.argv.slice(2), createCommandSpec);
83
+ const options = {
84
+ name: args["--name"] ?? args._.shift(),
85
+ interactive: args["--interactive"] ?? false,
86
+ version: parseVersionArgs(args),
87
+ };
88
+ return createProject(options);
89
+ }
90
+ export async function createProject(options) {
91
+ // checks if a project name was provided
92
+ let projectName = options.name;
93
+ if (!projectName) {
94
+ const result = await prompt([
95
+ {
96
+ type: "input",
97
+ name: "projectName",
98
+ message: "What is the project name?",
99
+ required: true,
100
+ result: (value) => value.toLowerCase().trim().replace(/\s+/g, "-"),
101
+ },
102
+ ]);
103
+ if (!result.projectName) {
104
+ console.log("\x1b[31m", "You have to provide name to your app.");
105
+ process.exit(1);
106
+ }
107
+ projectName = result.projectName;
108
+ }
109
+ const { documentModelsDir, editorsDir, } = options.interactive
110
+ ? await promptDirectories(defaultDirectories)
111
+ : defaultDirectories;
112
+ const appPath = path.join(process.cwd(), projectName);
113
+ try {
114
+ fs.mkdirSync(appPath);
115
+ }
116
+ catch (err) {
117
+ if (err.code === "EEXIST") {
118
+ console.log("\x1b[31m", `The folder ${projectName} already exists in the current directory, please give it another name.`, "\x1b[0m");
119
+ }
120
+ else {
121
+ console.log(err);
122
+ }
123
+ process.exit(1);
124
+ }
125
+ handleCreateProject(projectName, documentModelsDir, editorsDir, options.version, options.packageManager);
126
+ }
127
+ function handleCreateProject(projectName, documentModelsDir, editorsDir, version = "main", packageManager) {
128
+ packageManager = packageManager ?? envPackageManager;
129
+ try {
130
+ console.log("\x1b[33m", "Downloading the project structure...", "\x1b[0m");
131
+ runCmd(`git clone --depth 1 -b ${version} ${BOILERPLATE_REPO} ${projectName}`);
132
+ const appPath = path.join(process.cwd(), projectName);
133
+ process.chdir(appPath);
134
+ console.log("\x1b[34m", `Installing dependencies with ${packageManager}...`, "\x1b[0m");
135
+ runCmd(`${packageManager} install --loglevel error`);
136
+ fs.rmSync(path.join(appPath, "./.git"), { recursive: true });
137
+ runCmd(`git init -b ${version}`);
138
+ try {
139
+ fs.mkdirSync(path.join(appPath, documentModelsDir));
140
+ fs.writeFileSync(path.join(appPath, documentModelsDir, "index.ts"), "");
141
+ fs.mkdirSync(path.join(appPath, editorsDir));
142
+ fs.writeFileSync(path.join(appPath, editorsDir, "index.ts"), "");
143
+ }
144
+ catch (error) {
145
+ if (!error.message.includes("EEXIST")) {
146
+ throw error;
147
+ }
148
+ }
149
+ buildPackageJson(appPath, projectName);
150
+ buildPowerhouseConfig(appPath, documentModelsDir, editorsDir);
151
+ buildIndex(appPath, documentModelsDir, editorsDir);
152
+ console.log("\x1b[32m", "The installation is done!", "\x1b[0m");
153
+ console.log();
154
+ }
155
+ catch (error) {
156
+ console.log(error);
157
+ }
158
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./create-project.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/create-lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "./create-project.js";
@@ -0,0 +1,26 @@
1
+ import arg from "arg";
2
+ export declare const configSpec: {
3
+ readonly "--document-models": StringConstructor;
4
+ readonly "--editors": StringConstructor;
5
+ readonly "--interactive": BooleanConstructor;
6
+ readonly "--skip-format": BooleanConstructor;
7
+ readonly "--watch": BooleanConstructor;
8
+ readonly "-i": "--interactive";
9
+ readonly "-sf": "--skip-format";
10
+ readonly "-w": "--watch";
11
+ };
12
+ export declare function parseArgs<T extends arg.Spec>(argv: string[], spec: T): arg.Result<T>;
13
+ export declare function parseConfig(argv: string[]): Partial<{
14
+ documentModelsDir?: string;
15
+ editorsDir?: string;
16
+ skipFormat?: boolean;
17
+ interactive?: boolean;
18
+ watch?: boolean;
19
+ }>;
20
+ type DefaultDirectories = {
21
+ documentModelsDir: string;
22
+ editorsDir: string;
23
+ };
24
+ export declare function promptDirectories(defaultDirs: DefaultDirectories): Promise<DefaultDirectories>;
25
+ export {};
26
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/utils/cli.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAKtB,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,wBAAgB,SAAS,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,iBAOpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE;wBAElB,MAAM;iBACb,MAAM;iBACN,OAAO;kBACN,OAAO;YACb,OAAO;GAuBlB;AAED,KAAK,kBAAkB,GAAG;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,kBAAkB,+BAetE"}
@@ -0,0 +1,56 @@
1
+ import arg from "arg";
2
+ import enquirer from "enquirer";
3
+ const { prompt } = enquirer;
4
+ export const configSpec = {
5
+ "--document-models": String,
6
+ "--editors": String,
7
+ "--interactive": Boolean,
8
+ "--skip-format": Boolean,
9
+ "--watch": Boolean,
10
+ "-i": "--interactive",
11
+ "-sf": "--skip-format",
12
+ "-w": "--watch",
13
+ };
14
+ export function parseArgs(argv, spec) {
15
+ const args = arg(spec, {
16
+ permissive: true,
17
+ argv,
18
+ });
19
+ return args;
20
+ }
21
+ export function parseConfig(argv) {
22
+ const config = {};
23
+ const args = parseArgs(argv, configSpec);
24
+ if ("--document-models" in args) {
25
+ config.documentModelsDir = args["--document-models"];
26
+ }
27
+ if ("--editors" in args) {
28
+ config.editorsDir = args["--editors"];
29
+ }
30
+ if ("--skip-format" in args) {
31
+ config.skipFormat = true;
32
+ }
33
+ if ("--interactive" in args) {
34
+ config.interactive = true;
35
+ }
36
+ if ("--watch" in args) {
37
+ config.watch = true;
38
+ }
39
+ return config;
40
+ }
41
+ export async function promptDirectories(defaultDirs) {
42
+ return prompt([
43
+ {
44
+ type: "input",
45
+ name: "documentModelsDir",
46
+ message: "Where to place the Document Models?",
47
+ initial: defaultDirs.documentModelsDir,
48
+ },
49
+ {
50
+ type: "input",
51
+ name: "editorsDir",
52
+ message: "Where to place the Editors?",
53
+ initial: defaultDirs.editorsDir,
54
+ },
55
+ ]);
56
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./cli.js";
2
+ export * from "./mock.js";
3
+ export * from "./package-manager.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./cli.js";
2
+ export * from "./mock.js";
3
+ export * from "./package-manager.js";
@@ -0,0 +1,4 @@
1
+ import { generateMock as zodGenerateMock } from "@anatine/zod-mock";
2
+ export type generateMockTypeFn = typeof zodGenerateMock;
3
+ export declare const generateMock: generateMockTypeFn;
4
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/utils/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,MAAM,MAAM,kBAAkB,GAAG,OAAO,eAAe,CAAC;AAExD,eAAO,MAAM,YAAY,EAAE,kBAE1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { generateMock as zodGenerateMock } from "@anatine/zod-mock";
2
+ export const generateMock = (zodRef, options) => {
3
+ return zodGenerateMock(zodRef, options);
4
+ };