freezedts 0.12.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/dist/cli.d.ts +13 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +121 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/excluded-dirs.d.ts +2 -0
  8. package/dist/excluded-dirs.d.ts.map +1 -0
  9. package/dist/excluded-dirs.js +2 -0
  10. package/dist/excluded-dirs.js.map +1 -0
  11. package/dist/generator/config.d.ts +18 -0
  12. package/dist/generator/config.d.ts.map +1 -0
  13. package/dist/generator/config.js +40 -0
  14. package/dist/generator/config.js.map +1 -0
  15. package/dist/generator/emitter.d.ts +3 -0
  16. package/dist/generator/emitter.d.ts.map +1 -0
  17. package/dist/generator/emitter.js +170 -0
  18. package/dist/generator/emitter.js.map +1 -0
  19. package/dist/generator/generator.d.ts +8 -0
  20. package/dist/generator/generator.d.ts.map +1 -0
  21. package/dist/generator/generator.js +188 -0
  22. package/dist/generator/generator.js.map +1 -0
  23. package/dist/generator/parser.d.ts +32 -0
  24. package/dist/generator/parser.d.ts.map +1 -0
  25. package/dist/generator/parser.js +154 -0
  26. package/dist/generator/parser.js.map +1 -0
  27. package/dist/generator/watcher.d.ts +11 -0
  28. package/dist/generator/watcher.d.ts.map +1 -0
  29. package/dist/generator/watcher.js +45 -0
  30. package/dist/generator/watcher.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/runtime/copy.d.ts +3 -0
  36. package/dist/runtime/copy.d.ts.map +1 -0
  37. package/dist/runtime/copy.js +43 -0
  38. package/dist/runtime/copy.js.map +1 -0
  39. package/dist/runtime/deepEqual.d.ts +2 -0
  40. package/dist/runtime/deepEqual.d.ts.map +1 -0
  41. package/dist/runtime/deepEqual.js +43 -0
  42. package/dist/runtime/deepEqual.js.map +1 -0
  43. package/dist/runtime/deepFreeze.d.ts +2 -0
  44. package/dist/runtime/deepFreeze.d.ts.map +1 -0
  45. package/dist/runtime/deepFreeze.js +35 -0
  46. package/dist/runtime/deepFreeze.js.map +1 -0
  47. package/dist/runtime/freezed.d.ts +16 -0
  48. package/dist/runtime/freezed.d.ts.map +1 -0
  49. package/dist/runtime/freezed.js +11 -0
  50. package/dist/runtime/freezed.js.map +1 -0
  51. package/dist/runtime/index.d.ts +6 -0
  52. package/dist/runtime/index.d.ts.map +1 -0
  53. package/dist/runtime/index.js +6 -0
  54. package/dist/runtime/index.js.map +1 -0
  55. package/package.json +53 -0
@@ -0,0 +1,170 @@
1
+ const HEADER = `// generated by freezedts, do not edit\n`;
2
+ export function emitFreezedFile(classes) {
3
+ const needsWith = classes.some(c => c.copyWith !== false);
4
+ const needsDeepEqual = classes.some(c => c.equal !== false && c.equalityMode === 'deep' && c.properties.some(p => {
5
+ const baseType = p.type.replace(/\s*\|\s*undefined$/, '').trim();
6
+ return !PRIMITIVE_TYPES.has(baseType);
7
+ }));
8
+ const needsFreeze = classes.some(c => c.properties.some(p => {
9
+ const baseType = p.type.replace(/\s*\|\s*undefined$/, '').trim();
10
+ return !PRIMITIVE_TYPES.has(baseType);
11
+ }));
12
+ const runtimeImports = [];
13
+ if (needsWith)
14
+ runtimeImports.push('createWithProxy');
15
+ if (needsDeepEqual)
16
+ runtimeImports.push('deepEqual');
17
+ if (needsFreeze)
18
+ runtimeImports.push('deepFreeze');
19
+ const importLine = runtimeImports.length > 0
20
+ ? `\nimport { ${runtimeImports.join(', ')} } from 'freezedts/runtime';\n`
21
+ : '';
22
+ const sections = classes.map(emitClass);
23
+ return HEADER + importLine + '\n' + sections.join('\n\n') + '\n';
24
+ }
25
+ const PRIMITIVE_TYPES = new Set(['string', 'number', 'boolean', 'bigint']);
26
+ function emitClass(cls) {
27
+ const paramsType = emitParamsType(cls);
28
+ const parts = [paramsType];
29
+ if (cls.copyWith !== false) {
30
+ parts.push(emitWithType(cls));
31
+ }
32
+ parts.push(emitClassBody(cls));
33
+ return parts.join('\n\n');
34
+ }
35
+ function emitParamsType(cls) {
36
+ const fields = cls.properties
37
+ .map((p) => {
38
+ const optional = p.optional || p.hasDefault;
39
+ const type = p.isFreezed ? `$${p.type}` : p.type;
40
+ return ` ${p.name}${optional ? '?' : ''}: ${type};`;
41
+ })
42
+ .join('\n');
43
+ return `export type ${cls.className}Params = {\n${fields}\n};`;
44
+ }
45
+ function emitWithType(cls) {
46
+ const freezedProps = cls.properties.filter(p => p.isFreezed);
47
+ const members = freezedProps
48
+ .map(p => ` ${p.name}: ${p.type.replace(/\s*\|\s*undefined$/, '').trim()}With<Self>;`)
49
+ .join('\n');
50
+ const callSig = ` (overrides: Partial<${cls.className}Params>): Self;`;
51
+ if (freezedProps.length === 0) {
52
+ return `export type ${cls.className}With<Self> = {\n${callSig}\n};`;
53
+ }
54
+ return `export type ${cls.className}With<Self> = {\n${callSig}\n${members}\n};`;
55
+ }
56
+ function emitClassBody(cls) {
57
+ const readonlyFields = cls.properties
58
+ .map((p) => {
59
+ let type = p.isFreezed ? `$${p.type}` : p.type;
60
+ if (p.hasDefault)
61
+ type = type.replace(/ \| undefined$/, '');
62
+ return ` readonly ${p.name}!: ${type};`;
63
+ })
64
+ .join('\n');
65
+ const paramsVar = (cls.hasDefaults || cls.hasAsserts) ? 'resolved' : 'params';
66
+ const fieldConfigBlock = (cls.hasDefaults || cls.hasAsserts)
67
+ ? emitFieldConfigBlock(cls)
68
+ : '';
69
+ const assignments = cls.properties
70
+ .map((p) => {
71
+ const baseType = p.type.replace(/\s*\|\s*undefined$/, '').trim();
72
+ if (PRIMITIVE_TYPES.has(baseType)) {
73
+ return ` this.${p.name} = ${paramsVar}.${p.name};`;
74
+ }
75
+ return ` this.${p.name} = deepFreeze(${paramsVar}.${p.name});`;
76
+ })
77
+ .join('\n');
78
+ const methods = [];
79
+ if (cls.copyWith !== false)
80
+ methods.push(emitWithGetter(cls));
81
+ if (cls.equal !== false)
82
+ methods.push(emitEqualsMethod(cls));
83
+ if (cls.toString !== false)
84
+ methods.push(emitToStringMethod(cls));
85
+ return `export abstract class ${cls.generatedClassName} {
86
+ ${readonlyFields}
87
+
88
+ constructor(params: ${cls.className}Params) {
89
+ ${fieldConfigBlock}${assignments}
90
+ Object.freeze(this);
91
+ }
92
+
93
+ ${methods.join('\n\n')}
94
+ }`;
95
+ }
96
+ function emitFieldConfigBlock(cls) {
97
+ const lines = [
98
+ ` const __fields = (new.target as any)[Symbol.for('freezedts:options')]?.fields ?? {};`,
99
+ ` const resolved = { ...params } as Required<${cls.className}Params>;`,
100
+ ];
101
+ for (const p of cls.properties) {
102
+ if (p.hasDefault && p.hasAssert) {
103
+ const errorExpr = p.hasMessage
104
+ ? `__fields.${p.name}.message`
105
+ : `\`Assertion failed for '\${new.target.name}.${p.name}'\``;
106
+ lines.push(` if ((resolved as any).${p.name} === undefined) {`);
107
+ lines.push(` (resolved as any).${p.name} = __fields.${p.name}.default;`);
108
+ lines.push(` } else if (!__fields.${p.name}.assert((resolved as any).${p.name})) {`);
109
+ lines.push(` throw new Error(${errorExpr});`);
110
+ lines.push(` }`);
111
+ }
112
+ else if (p.hasDefault) {
113
+ lines.push(` if ((resolved as any).${p.name} === undefined) {`);
114
+ lines.push(` (resolved as any).${p.name} = __fields.${p.name}.default;`);
115
+ lines.push(` }`);
116
+ }
117
+ else if (p.hasAssert) {
118
+ const errorExpr = p.hasMessage
119
+ ? `__fields.${p.name}.message`
120
+ : `\`Assertion failed for '\${new.target.name}.${p.name}'\``;
121
+ lines.push(` if (!__fields.${p.name}.assert((resolved as any).${p.name})) {`);
122
+ lines.push(` throw new Error(${errorExpr});`);
123
+ lines.push(` }`);
124
+ }
125
+ }
126
+ return lines.join('\n') + '\n';
127
+ }
128
+ function emitWithGetter(cls) {
129
+ return ` get with(): ${cls.className}With<this> {
130
+ return createWithProxy(this);
131
+ }`;
132
+ }
133
+ function emitToStringMethod(cls) {
134
+ const parts = cls.properties
135
+ .map((p) => `${p.name}: \${this.${p.name}}`)
136
+ .join(', ');
137
+ return ` toString(): string {
138
+ return \`\${this.constructor.name}(${parts})\`;
139
+ }`;
140
+ }
141
+ function emitEqualsMethod(cls) {
142
+ const comparisons = cls.properties.map((p) => {
143
+ if (cls.equalityMode === 'deep') {
144
+ const baseType = p.type.replace(/\s*\|\s*undefined$/, '').trim();
145
+ if (baseType === 'number') {
146
+ return `Object.is(this.${p.name}, other.${p.name})`;
147
+ }
148
+ if (PRIMITIVE_TYPES.has(baseType)) {
149
+ return `this.${p.name} === other.${p.name}`;
150
+ }
151
+ return `deepEqual(this.${p.name}, other.${p.name})`;
152
+ }
153
+ if (p.isFreezed) {
154
+ if (p.optional) {
155
+ return `(this.${p.name} === other.${p.name} || (this.${p.name} != null && other.${p.name} != null && this.${p.name}.equals(other.${p.name})))`;
156
+ }
157
+ return `this.${p.name}.equals(other.${p.name})`;
158
+ }
159
+ return `this.${p.name} === other.${p.name}`;
160
+ });
161
+ const returnExpr = comparisons.length === 0
162
+ ? 'true'
163
+ : comparisons.join(' &&\n ');
164
+ return ` equals(other: unknown): boolean {
165
+ if (this === other) return true;
166
+ if (!(other instanceof ${cls.generatedClassName})) return false;
167
+ return ${returnExpr};
168
+ }`;
169
+ }
170
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/generator/emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ResolvedConfig } from './config.js';
2
+ export interface GenerateResult {
3
+ filesWritten: number;
4
+ errors: string[];
5
+ warnings: string[];
6
+ }
7
+ export declare function generate(filePaths: string[], config?: ResolvedConfig): GenerateResult;
8
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/generator/generator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA0ED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,cAAc,CAsHrF"}
@@ -0,0 +1,188 @@
1
+ import { Project, Node, SyntaxKind } from 'ts-morph';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { parseFreezedClasses } from './parser.js';
5
+ import { emitFreezedFile } from './emitter.js';
6
+ import { resolveClassOptions, DEFAULTS as DEFAULT_CONFIG } from './config.js';
7
+ function validateDefaults(cls, sourceFile, project) {
8
+ const errors = [];
9
+ for (const prop of cls.properties) {
10
+ if (!prop.hasDefault || !prop.hasAssert)
11
+ continue;
12
+ // Find the field config in the AST to extract default and assert text
13
+ const classDecl = sourceFile.getClasses().find(c => c.getName() === cls.className);
14
+ if (!classDecl)
15
+ continue;
16
+ const decorator = classDecl.getDecorators().find(d => d.getName() === 'freezed');
17
+ if (!decorator)
18
+ continue;
19
+ const args = decorator.getArguments();
20
+ if (args.length === 0)
21
+ continue;
22
+ const optionsArg = args[0];
23
+ if (!Node.isObjectLiteralExpression(optionsArg))
24
+ continue;
25
+ const fieldsProp = optionsArg.getProperty('fields');
26
+ if (!fieldsProp || !Node.isPropertyAssignment(fieldsProp))
27
+ continue;
28
+ const fieldsInit = fieldsProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression);
29
+ if (!fieldsInit)
30
+ continue;
31
+ const fieldProp = fieldsInit.getProperty(prop.name);
32
+ if (!fieldProp || !Node.isPropertyAssignment(fieldProp))
33
+ continue;
34
+ const fieldInit = fieldProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression);
35
+ if (!fieldInit)
36
+ continue;
37
+ const defaultProp = fieldInit.getProperty('default');
38
+ const assertProp = fieldInit.getProperty('assert');
39
+ if (!defaultProp || !assertProp)
40
+ continue;
41
+ if (!Node.isPropertyAssignment(defaultProp) || !Node.isPropertyAssignment(assertProp))
42
+ continue;
43
+ const defaultInit = defaultProp.getInitializer();
44
+ const assertInit = assertProp.getInitializer();
45
+ if (!defaultInit || !assertInit)
46
+ continue;
47
+ const defaultText = defaultInit.getText();
48
+ const assertText = assertInit.getText();
49
+ // Transpile TypeScript to JavaScript and eval
50
+ const testExpr = `(${assertText})(${defaultText})`;
51
+ try {
52
+ const tmpFile = project.createSourceFile('__validate_default.ts', `export default ${testExpr};\n`);
53
+ const emitOutput = tmpFile.getEmitOutput();
54
+ project.removeSourceFile(tmpFile);
55
+ const jsFiles = emitOutput.getOutputFiles();
56
+ if (jsFiles.length === 0)
57
+ continue;
58
+ const js = jsFiles[0].getText();
59
+ // Extract the default export value from the compiled JS
60
+ // CommonJS: exports.default = expr; ESM: export default expr;
61
+ const match = js.match(/exports\.default\s*=\s*(.+);/s) ?? js.match(/export default (.+);/s);
62
+ if (!match)
63
+ continue;
64
+ const result = eval(match[1]);
65
+ if (result === false) {
66
+ errors.push(`Default value for '${cls.className}.${prop.name}' fails its assertion`);
67
+ }
68
+ }
69
+ catch {
70
+ // Can't evaluate (external references, complex expressions) — skip silently
71
+ }
72
+ }
73
+ return errors;
74
+ }
75
+ export function generate(filePaths, config) {
76
+ const project = new Project({
77
+ skipAddingFilesFromTsConfig: true,
78
+ compilerOptions: { strict: true },
79
+ });
80
+ const resolvedConfig = config ?? DEFAULT_CONFIG;
81
+ let filesWritten = 0;
82
+ const errors = [];
83
+ const warnings = [];
84
+ // Phase 1: Parse all files
85
+ const parsed = new Map();
86
+ for (const filePath of filePaths) {
87
+ const absolutePath = path.resolve(filePath);
88
+ const sourceFile = project.addSourceFileAtPath(absolutePath);
89
+ try {
90
+ const { classes, warnings: parseWarnings } = parseFreezedClasses(sourceFile);
91
+ for (const w of parseWarnings) {
92
+ warnings.push(`${filePath}:${w.line}: ${w.message}`);
93
+ }
94
+ for (const cls of classes) {
95
+ const validationErrors = validateDefaults(cls, sourceFile, project);
96
+ errors.push(...validationErrors.map(e => `${filePath}: ${e}`));
97
+ }
98
+ if (classes.length > 0) {
99
+ parsed.set(filePath, { absolutePath, classes });
100
+ }
101
+ }
102
+ catch (e) {
103
+ errors.push(`${filePath}: ${e instanceof Error ? e.message : String(e)}`);
104
+ }
105
+ }
106
+ // Phase 2: Resolve isFreezed — mark properties whose type matches any
107
+ // @freezed class name across all parsed files
108
+ const classToFile = new Map();
109
+ for (const [filePath, { classes }] of parsed) {
110
+ for (const cls of classes) {
111
+ classToFile.set(cls.className, filePath);
112
+ }
113
+ }
114
+ for (const [filePath, { absolutePath, classes }] of parsed) {
115
+ for (const cls of classes) {
116
+ for (const prop of cls.properties) {
117
+ const baseType = prop.type.replace(/\s*\|\s*undefined$/, '').trim();
118
+ const sourceFilePath = classToFile.get(baseType);
119
+ if (sourceFilePath) {
120
+ prop.isFreezed = true;
121
+ if (sourceFilePath !== filePath) {
122
+ const fromAbsolute = parsed.get(sourceFilePath).absolutePath;
123
+ const relativePath = path.relative(path.dirname(absolutePath), fromAbsolute.replace(/\.ts$/, '.freezed.js'));
124
+ prop.importFrom = relativePath.startsWith('.')
125
+ ? relativePath.replace(/\\/g, '/')
126
+ : './' + relativePath.replace(/\\/g, '/');
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ // Phase 3: Resolve generation options — merge per-class with config defaults
133
+ for (const { classes } of parsed.values()) {
134
+ for (const cls of classes) {
135
+ const resolved = resolveClassOptions(cls, resolvedConfig);
136
+ cls.copyWith = resolved.copyWith;
137
+ cls.equal = resolved.equal;
138
+ cls.toString = resolved.toString;
139
+ }
140
+ }
141
+ // Phase 4: Emit and write
142
+ for (const [filePath, { absolutePath, classes }] of parsed) {
143
+ try {
144
+ let output = emitFreezedFile(classes);
145
+ // Collect cross-file imports
146
+ const imports = new Map();
147
+ for (const cls of classes) {
148
+ for (const prop of cls.properties) {
149
+ if (prop.isFreezed && prop.importFrom) {
150
+ if (!imports.has(prop.importFrom))
151
+ imports.set(prop.importFrom, new Set());
152
+ const symbols = imports.get(prop.importFrom);
153
+ symbols.add(`$${prop.type.replace(/\s*\|\s*undefined$/, '').trim()}`);
154
+ if (cls.copyWith !== false) {
155
+ symbols.add(`${prop.type.replace(/\s*\|\s*undefined$/, '').trim()}With`);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ if (imports.size > 0) {
161
+ const importLines = [...imports.entries()]
162
+ .map(([importPath, symbols]) => `import { ${[...symbols].join(', ')} } from '${importPath}';`)
163
+ .join('\n');
164
+ output = output.replace('// generated by freezedts, do not edit\n', `// generated by freezedts, do not edit\n\n${importLines}\n`);
165
+ }
166
+ if (resolvedConfig.format) {
167
+ output = formatOutput(output);
168
+ }
169
+ const outputPath = absolutePath.replace(/\.ts$/, '.freezed.ts');
170
+ fs.writeFileSync(outputPath, output, 'utf-8');
171
+ filesWritten++;
172
+ }
173
+ catch (e) {
174
+ errors.push(`${filePath}: ${e instanceof Error ? e.message : String(e)}`);
175
+ }
176
+ }
177
+ return { filesWritten, errors, warnings };
178
+ }
179
+ const formatProject = new Project({ useInMemoryFileSystem: true });
180
+ function formatOutput(code) {
181
+ const existing = formatProject.getSourceFile('format.ts');
182
+ if (existing)
183
+ formatProject.removeSourceFile(existing);
184
+ const file = formatProject.createSourceFile('format.ts', code);
185
+ file.formatText();
186
+ return file.getFullText();
187
+ }
188
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/generator/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { SourceFile } from 'ts-morph';
2
+ export interface ParsedProperty {
3
+ name: string;
4
+ type: string;
5
+ optional: boolean;
6
+ hasDefault: boolean;
7
+ hasAssert: boolean;
8
+ hasMessage: boolean;
9
+ isFreezed: boolean;
10
+ importFrom?: string;
11
+ }
12
+ export interface ParsedFreezedClass {
13
+ className: string;
14
+ generatedClassName: string;
15
+ properties: ParsedProperty[];
16
+ hasDefaults: boolean;
17
+ hasAsserts: boolean;
18
+ equalityMode: 'deep' | 'shallow';
19
+ copyWith?: boolean;
20
+ equal?: boolean;
21
+ toString?: boolean;
22
+ }
23
+ export interface ParseWarning {
24
+ message: string;
25
+ line: number;
26
+ }
27
+ export interface ParseResult {
28
+ classes: ParsedFreezedClass[];
29
+ warnings: ParseWarning[];
30
+ }
31
+ export declare function parseFreezedClasses(sourceFile: SourceFile): ParseResult;
32
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/generator/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqF,MAAM,UAAU,CAAC;AAEzH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAoDvE"}
@@ -0,0 +1,154 @@
1
+ import { Node, SyntaxKind } from 'ts-morph';
2
+ export function parseFreezedClasses(sourceFile) {
3
+ const classes = sourceFile.getClasses();
4
+ const results = [];
5
+ const warnings = [];
6
+ for (const cls of classes) {
7
+ const decorator = cls.getDecorators().find((d) => d.getName() === 'freezed');
8
+ if (!decorator)
9
+ continue;
10
+ const className = cls.getName();
11
+ if (!className)
12
+ continue;
13
+ const constructor = cls.getConstructors()[0];
14
+ if (!constructor) {
15
+ warnings.push({
16
+ message: `@freezed class '${className}' has no constructor`,
17
+ line: cls.getStartLineNumber(),
18
+ });
19
+ continue;
20
+ }
21
+ const paramsParam = constructor.getParameters()[0];
22
+ if (!paramsParam) {
23
+ warnings.push({
24
+ message: `@freezed class '${className}' constructor has no parameters`,
25
+ line: cls.getStartLineNumber(),
26
+ });
27
+ continue;
28
+ }
29
+ const { hasDefaults, hasAsserts, defaultFields, assertFields, messageFields } = extractFieldConfig(decorator);
30
+ const equalityMode = extractEqualityMode(decorator);
31
+ const { copyWith, equal, toString: toStringOpt } = extractGenerationOptions(decorator);
32
+ const paramType = paramsParam.getType();
33
+ const properties = extractProperties(paramType, defaultFields, assertFields, messageFields);
34
+ results.push({
35
+ className,
36
+ generatedClassName: `$${className}`,
37
+ properties,
38
+ hasDefaults,
39
+ hasAsserts,
40
+ equalityMode,
41
+ ...(copyWith !== undefined && { copyWith }),
42
+ ...(equal !== undefined && { equal }),
43
+ ...(toStringOpt !== undefined && { toString: toStringOpt }),
44
+ });
45
+ }
46
+ return { classes: results, warnings };
47
+ }
48
+ const NO_FIELD_CONFIG = {
49
+ hasDefaults: false,
50
+ hasAsserts: false,
51
+ defaultFields: new Set(),
52
+ assertFields: new Set(),
53
+ messageFields: new Set(),
54
+ };
55
+ function extractFieldConfig(decorator) {
56
+ const args = decorator.getArguments();
57
+ if (args.length === 0)
58
+ return NO_FIELD_CONFIG;
59
+ const optionsArg = args[0];
60
+ if (!Node.isObjectLiteralExpression(optionsArg))
61
+ return NO_FIELD_CONFIG;
62
+ const fieldsProp = optionsArg.getProperty('fields');
63
+ if (!fieldsProp || !Node.isPropertyAssignment(fieldsProp))
64
+ return NO_FIELD_CONFIG;
65
+ const fieldsInit = fieldsProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression);
66
+ if (!fieldsInit)
67
+ return { hasDefaults: false, hasAsserts: false, defaultFields: new Set(), assertFields: new Set(), messageFields: new Set() };
68
+ const defaultFields = new Set();
69
+ const assertFields = new Set();
70
+ const messageFields = new Set();
71
+ for (const prop of fieldsInit.getProperties()) {
72
+ if (Node.isPropertyAssignment(prop)) {
73
+ const fieldInit = prop.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression);
74
+ if (fieldInit) {
75
+ const name = prop.getName();
76
+ if (fieldInit.getProperty('default'))
77
+ defaultFields.add(name);
78
+ if (fieldInit.getProperty('assert'))
79
+ assertFields.add(name);
80
+ if (fieldInit.getProperty('message'))
81
+ messageFields.add(name);
82
+ }
83
+ }
84
+ }
85
+ return {
86
+ hasDefaults: defaultFields.size > 0,
87
+ hasAsserts: assertFields.size > 0,
88
+ defaultFields,
89
+ assertFields,
90
+ messageFields,
91
+ };
92
+ }
93
+ function extractEqualityMode(decorator) {
94
+ const args = decorator.getArguments();
95
+ if (args.length === 0)
96
+ return 'deep';
97
+ const optionsArg = args[0];
98
+ if (!Node.isObjectLiteralExpression(optionsArg))
99
+ return 'deep';
100
+ const equalityProp = optionsArg.getProperty('equality');
101
+ if (!equalityProp || !Node.isPropertyAssignment(equalityProp))
102
+ return 'deep';
103
+ const init = equalityProp.getInitializer();
104
+ if (!init)
105
+ return 'deep';
106
+ const text = init.getText().replace(/['"]/g, '');
107
+ return text === 'shallow' ? 'shallow' : 'deep';
108
+ }
109
+ function extractBooleanOption(optionsArg, name) {
110
+ const prop = optionsArg.getProperty(name);
111
+ if (!prop || !Node.isPropertyAssignment(prop))
112
+ return undefined;
113
+ const init = prop.getInitializer();
114
+ if (!init)
115
+ return undefined;
116
+ const text = init.getText();
117
+ if (text === 'true')
118
+ return true;
119
+ if (text === 'false')
120
+ return false;
121
+ return undefined;
122
+ }
123
+ function extractGenerationOptions(decorator) {
124
+ const args = decorator.getArguments();
125
+ if (args.length === 0)
126
+ return { copyWith: undefined, equal: undefined, toString: undefined };
127
+ const optionsArg = args[0];
128
+ if (!Node.isObjectLiteralExpression(optionsArg))
129
+ return { copyWith: undefined, equal: undefined, toString: undefined };
130
+ return {
131
+ copyWith: extractBooleanOption(optionsArg, 'copyWith'),
132
+ equal: extractBooleanOption(optionsArg, 'equal'),
133
+ toString: extractBooleanOption(optionsArg, 'toString'),
134
+ };
135
+ }
136
+ function extractProperties(type, defaultFields, assertFields, messageFields) {
137
+ return type.getProperties().map((prop) => {
138
+ const propType = prop.getValueDeclaration()?.getType();
139
+ const isOptional = prop.isOptional();
140
+ let typeText = propType?.getText() ?? 'unknown';
141
+ typeText = typeText.replace(/import\(.*?\)\./g, '');
142
+ const name = prop.getName();
143
+ return {
144
+ name,
145
+ type: typeText,
146
+ optional: isOptional,
147
+ hasDefault: defaultFields.has(name),
148
+ hasAssert: assertFields.has(name),
149
+ hasMessage: messageFields.has(name),
150
+ isFreezed: false,
151
+ };
152
+ });
153
+ }
154
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/generator/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function shouldProcess(filePath: string): boolean;
2
+ export interface WatcherOptions {
3
+ dir: string;
4
+ onChange: (changedFiles: string[]) => void;
5
+ debounceMs?: number;
6
+ }
7
+ export interface Watcher {
8
+ close: () => void;
9
+ }
10
+ export declare function createWatcher(options: WatcherOptions): Watcher;
11
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/generator/watcher.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQvD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CA0B9D"}