@haneullabs/codegen 0.1.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 (119) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/README.md +195 -0
  3. package/dist/cjs/bin/bash-complete.d.ts +2 -0
  4. package/dist/cjs/bin/bash-complete.js +51 -0
  5. package/dist/cjs/bin/bash-complete.js.map +7 -0
  6. package/dist/cjs/bin/cli.d.ts +2 -0
  7. package/dist/cjs/bin/cli.js +34 -0
  8. package/dist/cjs/bin/cli.js.map +7 -0
  9. package/dist/cjs/cli/cli.d.ts +1 -0
  10. package/dist/cjs/cli/cli.js +49 -0
  11. package/dist/cjs/cli/cli.js.map +7 -0
  12. package/dist/cjs/cli/commands/generate/command.d.ts +1 -0
  13. package/dist/cjs/cli/commands/generate/command.js +80 -0
  14. package/dist/cjs/cli/commands/generate/command.js.map +7 -0
  15. package/dist/cjs/cli/commands/generate/impl.d.ts +8 -0
  16. package/dist/cjs/cli/commands/generate/impl.js +66 -0
  17. package/dist/cjs/cli/commands/generate/impl.js.map +7 -0
  18. package/dist/cjs/cli/context.d.ts +6 -0
  19. package/dist/cjs/cli/context.js +45 -0
  20. package/dist/cjs/cli/context.js.map +7 -0
  21. package/dist/cjs/config.d.ts +51 -0
  22. package/dist/cjs/config.js +75 -0
  23. package/dist/cjs/config.js.map +7 -0
  24. package/dist/cjs/file-builder.d.ts +13 -0
  25. package/dist/cjs/file-builder.js +83 -0
  26. package/dist/cjs/file-builder.js.map +7 -0
  27. package/dist/cjs/generate-utils.d.ts +1 -0
  28. package/dist/cjs/generate-utils.js +187 -0
  29. package/dist/cjs/generate-utils.js.map +7 -0
  30. package/dist/cjs/index.d.ts +8 -0
  31. package/dist/cjs/index.js +124 -0
  32. package/dist/cjs/index.js.map +7 -0
  33. package/dist/cjs/move-module-builder.d.ts +26 -0
  34. package/dist/cjs/move-module-builder.js +464 -0
  35. package/dist/cjs/move-module-builder.js.map +7 -0
  36. package/dist/cjs/package.json +5 -0
  37. package/dist/cjs/render-types.d.ts +19 -0
  38. package/dist/cjs/render-types.js +313 -0
  39. package/dist/cjs/render-types.js.map +7 -0
  40. package/dist/cjs/summary.d.ts +3 -0
  41. package/dist/cjs/summary.js +218 -0
  42. package/dist/cjs/summary.js.map +7 -0
  43. package/dist/cjs/types/deserialized.d.ts +89 -0
  44. package/dist/cjs/types/deserialized.js +17 -0
  45. package/dist/cjs/types/deserialized.js.map +7 -0
  46. package/dist/cjs/types/summary.d.ts +105 -0
  47. package/dist/cjs/types/summary.js +17 -0
  48. package/dist/cjs/types/summary.js.map +7 -0
  49. package/dist/cjs/utils.d.ts +22 -0
  50. package/dist/cjs/utils.js +164 -0
  51. package/dist/cjs/utils.js.map +7 -0
  52. package/dist/esm/bin/bash-complete.d.ts +2 -0
  53. package/dist/esm/bin/bash-complete.js +31 -0
  54. package/dist/esm/bin/bash-complete.js.map +7 -0
  55. package/dist/esm/bin/cli.d.ts +2 -0
  56. package/dist/esm/bin/cli.js +32 -0
  57. package/dist/esm/bin/cli.js.map +7 -0
  58. package/dist/esm/cli/cli.d.ts +1 -0
  59. package/dist/esm/cli/cli.js +29 -0
  60. package/dist/esm/cli/cli.js.map +7 -0
  61. package/dist/esm/cli/commands/generate/command.d.ts +1 -0
  62. package/dist/esm/cli/commands/generate/command.js +50 -0
  63. package/dist/esm/cli/commands/generate/command.js.map +7 -0
  64. package/dist/esm/cli/commands/generate/impl.d.ts +8 -0
  65. package/dist/esm/cli/commands/generate/impl.js +46 -0
  66. package/dist/esm/cli/commands/generate/impl.js.map +7 -0
  67. package/dist/esm/cli/context.d.ts +6 -0
  68. package/dist/esm/cli/context.js +15 -0
  69. package/dist/esm/cli/context.js.map +7 -0
  70. package/dist/esm/config.d.ts +51 -0
  71. package/dist/esm/config.js +45 -0
  72. package/dist/esm/config.js.map +7 -0
  73. package/dist/esm/file-builder.d.ts +13 -0
  74. package/dist/esm/file-builder.js +63 -0
  75. package/dist/esm/file-builder.js.map +7 -0
  76. package/dist/esm/generate-utils.d.ts +1 -0
  77. package/dist/esm/generate-utils.js +167 -0
  78. package/dist/esm/generate-utils.js.map +7 -0
  79. package/dist/esm/index.d.ts +8 -0
  80. package/dist/esm/index.js +104 -0
  81. package/dist/esm/index.js.map +7 -0
  82. package/dist/esm/move-module-builder.d.ts +26 -0
  83. package/dist/esm/move-module-builder.js +457 -0
  84. package/dist/esm/move-module-builder.js.map +7 -0
  85. package/dist/esm/package.json +5 -0
  86. package/dist/esm/render-types.d.ts +19 -0
  87. package/dist/esm/render-types.js +293 -0
  88. package/dist/esm/render-types.js.map +7 -0
  89. package/dist/esm/summary.d.ts +3 -0
  90. package/dist/esm/summary.js +198 -0
  91. package/dist/esm/summary.js.map +7 -0
  92. package/dist/esm/types/deserialized.d.ts +89 -0
  93. package/dist/esm/types/deserialized.js +1 -0
  94. package/dist/esm/types/deserialized.js.map +7 -0
  95. package/dist/esm/types/summary.d.ts +105 -0
  96. package/dist/esm/types/summary.js +1 -0
  97. package/dist/esm/types/summary.js.map +7 -0
  98. package/dist/esm/utils.d.ts +22 -0
  99. package/dist/esm/utils.js +134 -0
  100. package/dist/esm/utils.js.map +7 -0
  101. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  102. package/dist/tsconfig.tsbuildinfo +1 -0
  103. package/package.json +70 -0
  104. package/src/bin/bash-complete.ts +35 -0
  105. package/src/bin/cli.ts +40 -0
  106. package/src/cli/cli.ts +29 -0
  107. package/src/cli/commands/generate/command.ts +50 -0
  108. package/src/cli/commands/generate/impl.ts +66 -0
  109. package/src/cli/context.ts +21 -0
  110. package/src/config.ts +54 -0
  111. package/src/file-builder.ts +74 -0
  112. package/src/generate-utils.ts +163 -0
  113. package/src/index.ts +131 -0
  114. package/src/move-module-builder.ts +599 -0
  115. package/src/render-types.ts +349 -0
  116. package/src/summary.ts +242 -0
  117. package/src/types/deserialized.ts +107 -0
  118. package/src/types/summary.ts +144 -0
  119. package/src/utils.ts +180 -0
@@ -0,0 +1,144 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export interface ModuleSummary {
5
+ id: {
6
+ address: string;
7
+ name: string;
8
+ };
9
+ doc?: string | null;
10
+ immediate_dependencies: {
11
+ address: string;
12
+ name: string;
13
+ }[];
14
+ attributes?: Attribute[];
15
+ functions: Record<string, FunctionSummary>;
16
+ structs: Record<string, StructSummary>;
17
+ enums: Record<string, EnumSummary>;
18
+ }
19
+
20
+ export type Attribute =
21
+ | {
22
+ Name: string;
23
+ }
24
+ | {
25
+ Assigned: [string, string];
26
+ }
27
+ | {
28
+ Parameterized: [string, Attribute[]];
29
+ };
30
+
31
+ export interface FunctionSummary {
32
+ source_index?: number;
33
+ index: number;
34
+ doc?: string | null;
35
+ attributes?: Attribute[];
36
+ visibility: FunctionVisibility;
37
+ entry: boolean;
38
+ macro_?: boolean;
39
+ type_parameters: DatatypeParameter[];
40
+ parameters: Parameter[];
41
+ return_: Type[];
42
+ }
43
+
44
+ export interface StructSummary {
45
+ index: number;
46
+ doc?: string | null;
47
+ attributes?: Attribute[];
48
+ abilities: Ability[];
49
+ type_parameters: DatatypeParameter[];
50
+ fields: Fields;
51
+ }
52
+
53
+ export interface EnumSummary {
54
+ index: number;
55
+ doc?: string | null;
56
+ attributes?: Attribute[];
57
+ abilities: Ability[];
58
+ type_parameters: DatatypeParameter[];
59
+ variants: Record<string, Variant>;
60
+ }
61
+
62
+ export interface Variant {
63
+ index: number;
64
+ doc?: string | null;
65
+ fields: Fields;
66
+ }
67
+
68
+ export interface Fields {
69
+ positional_fields: boolean;
70
+ fields: Record<string, Field>;
71
+ }
72
+
73
+ export interface Field {
74
+ index: number;
75
+ doc?: string | null;
76
+ type_: Type;
77
+ }
78
+
79
+ export interface TypeParameter {
80
+ name?: string;
81
+ constraints: Ability[];
82
+ }
83
+
84
+ export interface DatatypeParameter extends TypeParameter {
85
+ phantom: boolean;
86
+ }
87
+
88
+ export type Ability = 'Drop' | 'Copy' | 'Key' | 'Store';
89
+
90
+ export interface Parameter {
91
+ name?: string;
92
+ type_: Type;
93
+ }
94
+
95
+ export type Type =
96
+ | 'bool'
97
+ | 'u8'
98
+ | 'u16'
99
+ | 'u32'
100
+ | 'u64'
101
+ | 'u128'
102
+ | 'u256'
103
+ | 'address'
104
+ | 'signer'
105
+ | '_'
106
+ | {
107
+ Datatype: Datatype;
108
+ }
109
+ | {
110
+ vector: Type;
111
+ }
112
+ | {
113
+ Reference: [boolean, Type];
114
+ }
115
+ | {
116
+ TypeParameter: number;
117
+ }
118
+ | {
119
+ NamedTypeParameter: string;
120
+ }
121
+ | {
122
+ tuple: Type[];
123
+ }
124
+ | {
125
+ fun: [Type[], Type];
126
+ };
127
+
128
+ export interface Datatype {
129
+ module: ModuleId;
130
+ name: string;
131
+ type_arguments: TypeArgument[];
132
+ }
133
+
134
+ export interface TypeArgument {
135
+ phantom: boolean;
136
+ argument: Type;
137
+ }
138
+
139
+ export interface ModuleId {
140
+ address: string;
141
+ name: string;
142
+ }
143
+
144
+ export type FunctionVisibility = 'Public' | 'Friend' | 'Package' | 'Private';
package/src/utils.ts ADDED
@@ -0,0 +1,180 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { format } from 'prettier';
4
+ import ts from 'typescript';
5
+ import type { Type } from './types/summary.js';
6
+ import { HANEUL_FRAMEWORK_ADDRESS, HANEUL_SYSTEM_ADDRESS } from './render-types.js';
7
+
8
+ export function printNodes(...nodes: ts.Node[]) {
9
+ const printer = ts.createPrinter({
10
+ removeComments: false,
11
+ });
12
+
13
+ return nodes
14
+ .map((node) => printer.printNode(ts.EmitHint.Unspecified, node, node.getSourceFile()))
15
+ .join('\n');
16
+ }
17
+
18
+ type TSTemplateValue = string | number | boolean | ts.Statement[] | ts.Expression;
19
+
20
+ export function parseTS(strings: TemplateStringsArray, ...values: TSTemplateValue[]) {
21
+ const source = strings.reduce((acc, str, i) => {
22
+ if (typeof values[i] === 'object') {
23
+ if (Array.isArray(values[i])) {
24
+ return `${acc}${str}${printNodes(...values[i])}`;
25
+ }
26
+
27
+ return `${acc}${str}${printNodes(values[i])}`;
28
+ }
29
+
30
+ return `${acc}${str}${values[i] ?? ''}`;
31
+ }, '');
32
+
33
+ const lines = source.replace(/^\s/m, '').split('\n');
34
+ const firstLine = lines[0];
35
+ const indent = firstLine.match(/^\s*/)?.[0] ?? '';
36
+ const unIndented = lines.map((line) => line.replace(indent, '')).join('\n');
37
+
38
+ const sourceFile = ts.createSourceFile('file.ts', unIndented, ts.ScriptTarget.Latest, true);
39
+ return [...sourceFile.statements.values()];
40
+ }
41
+
42
+ export async function mapToObject<T>({
43
+ items,
44
+ mapper,
45
+ getComment,
46
+ }: {
47
+ items: Iterable<T>;
48
+ mapper: (item: T) => Promise<null | [string, TSTemplateValue]> | null | [string, TSTemplateValue];
49
+ getComment?: (item: T) => string | null | undefined;
50
+ }) {
51
+ const fieldProps = await Promise.all(
52
+ (
53
+ await Promise.all(
54
+ [...items].map(async (item) => {
55
+ const mapped = await mapper(item);
56
+ if (!mapped) {
57
+ return null;
58
+ }
59
+
60
+ const [key, value] = mapped;
61
+ return [item, key, value] as const;
62
+ }),
63
+ )
64
+ )
65
+ .filter((value) => value !== null)
66
+ .map(([item, key, value]) => {
67
+ const [node] = parseTS /* ts */ `({${key}: ${value}})`;
68
+
69
+ if (!ts.isExpressionStatement(node)) {
70
+ throw new Error('Expected Expression statement');
71
+ }
72
+
73
+ if (!ts.isParenthesizedExpression(node.expression)) {
74
+ throw new Error('Expected Parenthesized Expression');
75
+ }
76
+
77
+ if (!ts.isObjectLiteralExpression(node.expression.expression)) {
78
+ throw new Error('Expected Object Literal Expression');
79
+ }
80
+
81
+ const comment = getComment?.(item);
82
+ return withComment({ comment }, node.expression.expression.properties[0]);
83
+ }),
84
+ );
85
+
86
+ return ts.factory.createObjectLiteralExpression(fieldProps, true);
87
+ }
88
+
89
+ export async function withComment<T extends ts.Node | ts.Node[]>(
90
+ options:
91
+ | { comment?: string | null; doc?: never }
92
+ | { doc?: string | null | undefined; comment?: never },
93
+ nodes: T,
94
+ ): Promise<T> {
95
+ const comment = options.comment ?? options.doc;
96
+
97
+ if (comment) {
98
+ const firstNode = Array.isArray(nodes) ? nodes[0] : (nodes as ts.Node);
99
+ ts.addSyntheticLeadingComment(
100
+ firstNode,
101
+ ts.SyntaxKind.MultiLineCommentTrivia,
102
+ await formatComment(comment),
103
+ true,
104
+ );
105
+ }
106
+
107
+ return nodes;
108
+ }
109
+
110
+ export async function formatComment(text: string) {
111
+ const lines = (
112
+ await format(text, {
113
+ printWidth: 80,
114
+ semi: true,
115
+ singleQuote: true,
116
+ tabWidth: 2,
117
+ trailingComma: 'all',
118
+ useTabs: true,
119
+ proseWrap: 'always',
120
+ parser: 'markdown',
121
+ })
122
+ )
123
+ .trim()
124
+ .replaceAll('*/', '*\\/')
125
+ .split('\n');
126
+
127
+ if (lines.length === 1) return `* ${lines[0]} `;
128
+
129
+ return `*\n${lines.map((line) => ` * ${line}`).join('\n')}\n `;
130
+ }
131
+
132
+ export function camelCase(str: string) {
133
+ return str.replaceAll(/(?:_)([a-z])/g, (_, letter) => letter.toUpperCase());
134
+ }
135
+
136
+ export function capitalize(str: string) {
137
+ return str.charAt(0).toUpperCase() + str.slice(1);
138
+ }
139
+
140
+ export function isWellKnownObjectParameter(
141
+ type: Type,
142
+ resolveAddress: (address: string) => string,
143
+ ) {
144
+ if (typeof type === 'string') {
145
+ return false;
146
+ }
147
+
148
+ if ('Reference' in type) {
149
+ return isWellKnownObjectParameter(type.Reference[1], resolveAddress);
150
+ }
151
+
152
+ if (!('Datatype' in type)) {
153
+ return false;
154
+ }
155
+
156
+ const { Datatype } = type;
157
+
158
+ const address = resolveAddress(Datatype.module.address);
159
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
160
+ if (Datatype.module.name === 'deny_list') {
161
+ return Datatype.name === 'DenyList';
162
+ }
163
+
164
+ if (Datatype.module.name === 'random') {
165
+ return Datatype.name === 'Random';
166
+ }
167
+
168
+ if (Datatype.module.name === 'clock') {
169
+ return Datatype.name === 'Clock';
170
+ }
171
+ }
172
+
173
+ if (address === HANEUL_SYSTEM_ADDRESS) {
174
+ if (Datatype.module.name === 'haneul_system') {
175
+ return Datatype.name === 'HaneulSystemState';
176
+ }
177
+ }
178
+
179
+ return false;
180
+ }