@datachonk/cli 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.
- package/README.md +200 -0
- package/dist/__tests__/cache.test.d.ts +2 -0
- package/dist/__tests__/cache.test.d.ts.map +1 -0
- package/dist/__tests__/cache.test.js +40 -0
- package/dist/__tests__/cache.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +113 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/templates.test.d.ts +2 -0
- package/dist/__tests__/templates.test.d.ts.map +1 -0
- package/dist/__tests__/templates.test.js +51 -0
- package/dist/__tests__/templates.test.js.map +1 -0
- package/dist/commands/analyze.d.ts +10 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +156 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +121 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +287 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/docs.d.ts +7 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +208 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/generate.d.ts +9 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +130 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +149 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lineage.d.ts +9 -0
- package/dist/commands/lineage.d.ts.map +1 -0
- package/dist/commands/lineage.js +186 -0
- package/dist/commands/lineage.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +213 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/review.d.ts +8 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +215 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/scan.d.ts +18 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +335 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +244 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +232 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/analyzer.d.ts +39 -0
- package/dist/utils/analyzer.d.ts.map +1 -0
- package/dist/utils/analyzer.js +310 -0
- package/dist/utils/analyzer.js.map +1 -0
- package/dist/utils/cache.d.ts +98 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +253 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +56 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +108 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/generators.d.ts +8 -0
- package/dist/utils/generators.d.ts.map +1 -0
- package/dist/utils/generators.js +265 -0
- package/dist/utils/generators.js.map +1 -0
- package/dist/utils/plugins.d.ts +94 -0
- package/dist/utils/plugins.d.ts.map +1 -0
- package/dist/utils/plugins.js +164 -0
- package/dist/utils/plugins.js.map +1 -0
- package/dist/utils/templates.d.ts +57 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +458 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
// Template locations
|
|
5
|
+
const TEMPLATE_DIRS = {
|
|
6
|
+
builtIn: join(dirname(new URL(import.meta.url).pathname), "..", "templates"),
|
|
7
|
+
project: join(process.cwd(), ".datachonk", "templates"),
|
|
8
|
+
user: join(process.env.HOME || "~", ".datachonk", "templates"),
|
|
9
|
+
};
|
|
10
|
+
// Built-in templates
|
|
11
|
+
const BUILT_IN_TEMPLATES = [
|
|
12
|
+
// Staging model template
|
|
13
|
+
{
|
|
14
|
+
name: "staging-model",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
description: "Standard staging model that cleans and renames source columns",
|
|
17
|
+
category: "staging",
|
|
18
|
+
variables: [
|
|
19
|
+
{ name: "source_name", type: "string", required: true, description: "Name of the source" },
|
|
20
|
+
{ name: "source_table", type: "string", required: true, description: "Source table name" },
|
|
21
|
+
{ name: "columns", type: "array", required: false, description: "Columns to select" },
|
|
22
|
+
{ name: "rename_columns", type: "object", required: false, description: "Column rename mapping" },
|
|
23
|
+
{ name: "add_metadata", type: "boolean", required: false, default: true, description: "Add metadata columns" },
|
|
24
|
+
],
|
|
25
|
+
content: `{{/*
|
|
26
|
+
Staging Model Template
|
|
27
|
+
Generated by DataChonk
|
|
28
|
+
*/}}
|
|
29
|
+
|
|
30
|
+
with source as (
|
|
31
|
+
select * from {{ source('{{ source_name }}', '{{ source_table }}') }}
|
|
32
|
+
),
|
|
33
|
+
|
|
34
|
+
renamed as (
|
|
35
|
+
select
|
|
36
|
+
{%- if columns %}
|
|
37
|
+
{%- for col in columns %}
|
|
38
|
+
{%- if rename_columns and col in rename_columns %}
|
|
39
|
+
{{ col }} as {{ rename_columns[col] }}{% if not loop.last %},{% endif %}
|
|
40
|
+
{%- else %}
|
|
41
|
+
{{ col }}{% if not loop.last %},{% endif %}
|
|
42
|
+
{%- endif %}
|
|
43
|
+
{%- endfor %}
|
|
44
|
+
{%- else %}
|
|
45
|
+
-- TODO: Add column selections
|
|
46
|
+
*
|
|
47
|
+
{%- endif %}
|
|
48
|
+
|
|
49
|
+
{%- if add_metadata %}
|
|
50
|
+
-- Metadata columns
|
|
51
|
+
, _loaded_at
|
|
52
|
+
, _source_file
|
|
53
|
+
{%- endif %}
|
|
54
|
+
from source
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
select * from renamed
|
|
58
|
+
`,
|
|
59
|
+
},
|
|
60
|
+
// Dimension model template
|
|
61
|
+
{
|
|
62
|
+
name: "dimension-model",
|
|
63
|
+
version: "1.0.0",
|
|
64
|
+
description: "Dimension table following Kimball methodology",
|
|
65
|
+
category: "mart",
|
|
66
|
+
variables: [
|
|
67
|
+
{ name: "entity_name", type: "string", required: true, description: "Name of the entity" },
|
|
68
|
+
{ name: "primary_key", type: "string", required: true, description: "Primary key column" },
|
|
69
|
+
{ name: "source_model", type: "string", required: true, description: "Source staging model" },
|
|
70
|
+
{ name: "scd_type", type: "string", required: false, default: "1", description: "SCD type (1 or 2)" },
|
|
71
|
+
{ name: "business_keys", type: "array", required: false, description: "Business key columns" },
|
|
72
|
+
],
|
|
73
|
+
content: `{{/*
|
|
74
|
+
Dimension Model Template - {{ entity_name }}
|
|
75
|
+
SCD Type: {{ scd_type | default: '1' }}
|
|
76
|
+
Generated by DataChonk
|
|
77
|
+
*/}}
|
|
78
|
+
|
|
79
|
+
{{ config(
|
|
80
|
+
materialized='table',
|
|
81
|
+
unique_key='{{ primary_key }}'
|
|
82
|
+
) }}
|
|
83
|
+
|
|
84
|
+
with source_data as (
|
|
85
|
+
select * from {{ ref('{{ source_model }}') }}
|
|
86
|
+
),
|
|
87
|
+
|
|
88
|
+
{%- if scd_type == '2' %}
|
|
89
|
+
-- SCD Type 2: Track historical changes
|
|
90
|
+
with_row_hash as (
|
|
91
|
+
select
|
|
92
|
+
*,
|
|
93
|
+
{{ dbt_utils.generate_surrogate_key(business_keys) }} as row_hash
|
|
94
|
+
from source_data
|
|
95
|
+
),
|
|
96
|
+
|
|
97
|
+
final as (
|
|
98
|
+
select
|
|
99
|
+
{{ dbt_utils.generate_surrogate_key([primary_key]) }} as {{ primary_key }}_sk,
|
|
100
|
+
*,
|
|
101
|
+
current_timestamp as valid_from,
|
|
102
|
+
null::timestamp as valid_to,
|
|
103
|
+
true as is_current
|
|
104
|
+
from with_row_hash
|
|
105
|
+
)
|
|
106
|
+
{%- else %}
|
|
107
|
+
-- SCD Type 1: Overwrite changes
|
|
108
|
+
final as (
|
|
109
|
+
select
|
|
110
|
+
{{ dbt_utils.generate_surrogate_key(['{{ primary_key }}']) }} as {{ primary_key }}_sk,
|
|
111
|
+
*,
|
|
112
|
+
current_timestamp as updated_at
|
|
113
|
+
from source_data
|
|
114
|
+
)
|
|
115
|
+
{%- endif %}
|
|
116
|
+
|
|
117
|
+
select * from final
|
|
118
|
+
`,
|
|
119
|
+
},
|
|
120
|
+
// Fact model template
|
|
121
|
+
{
|
|
122
|
+
name: "fact-model",
|
|
123
|
+
version: "1.0.0",
|
|
124
|
+
description: "Fact table following Kimball methodology",
|
|
125
|
+
category: "mart",
|
|
126
|
+
variables: [
|
|
127
|
+
{ name: "fact_name", type: "string", required: true, description: "Name of the fact" },
|
|
128
|
+
{ name: "grain", type: "string", required: true, description: "Description of the grain" },
|
|
129
|
+
{ name: "source_model", type: "string", required: true, description: "Source staging model" },
|
|
130
|
+
{ name: "dimension_refs", type: "array", required: false, description: "Dimension foreign keys" },
|
|
131
|
+
{ name: "measures", type: "array", required: false, description: "Measure columns" },
|
|
132
|
+
],
|
|
133
|
+
content: `{{/*
|
|
134
|
+
Fact Model Template - {{ fact_name }}
|
|
135
|
+
Grain: {{ grain }}
|
|
136
|
+
Generated by DataChonk
|
|
137
|
+
*/}}
|
|
138
|
+
|
|
139
|
+
{{ config(
|
|
140
|
+
materialized='incremental',
|
|
141
|
+
unique_key='event_id',
|
|
142
|
+
incremental_strategy='merge'
|
|
143
|
+
) }}
|
|
144
|
+
|
|
145
|
+
with source_data as (
|
|
146
|
+
select * from {{ ref('{{ source_model }}') }}
|
|
147
|
+
{% if is_incremental() %}
|
|
148
|
+
where _loaded_at > (select max(_loaded_at) from {{ this }})
|
|
149
|
+
{% endif %}
|
|
150
|
+
),
|
|
151
|
+
|
|
152
|
+
{%- if dimension_refs %}
|
|
153
|
+
-- Join dimension keys
|
|
154
|
+
with_dimensions as (
|
|
155
|
+
select
|
|
156
|
+
src.*
|
|
157
|
+
{%- for dim in dimension_refs %}
|
|
158
|
+
, {{ dim.dimension }}.{{ dim.key }}_sk as {{ dim.key }}_fk
|
|
159
|
+
{%- endfor %}
|
|
160
|
+
from source_data src
|
|
161
|
+
{%- for dim in dimension_refs %}
|
|
162
|
+
left join {{ ref(dim.dimension) }} as {{ dim.dimension }}
|
|
163
|
+
on src.{{ dim.join_key }} = {{ dim.dimension }}.{{ dim.key }}
|
|
164
|
+
{%- endfor %}
|
|
165
|
+
),
|
|
166
|
+
{%- endif %}
|
|
167
|
+
|
|
168
|
+
final as (
|
|
169
|
+
select
|
|
170
|
+
{{ dbt_utils.generate_surrogate_key(['event_id']) }} as fact_{{ fact_name }}_sk,
|
|
171
|
+
|
|
172
|
+
-- Dimension foreign keys
|
|
173
|
+
{%- if dimension_refs %}
|
|
174
|
+
{%- for dim in dimension_refs %}
|
|
175
|
+
{{ dim.key }}_fk,
|
|
176
|
+
{%- endfor %}
|
|
177
|
+
{%- endif %}
|
|
178
|
+
|
|
179
|
+
-- Degenerate dimensions / attributes
|
|
180
|
+
event_timestamp,
|
|
181
|
+
|
|
182
|
+
-- Measures
|
|
183
|
+
{%- if measures %}
|
|
184
|
+
{%- for measure in measures %}
|
|
185
|
+
{{ measure }}{% if not loop.last %},{% endif %}
|
|
186
|
+
{%- endfor %}
|
|
187
|
+
{%- else %}
|
|
188
|
+
-- TODO: Add measure columns
|
|
189
|
+
1 as count_events
|
|
190
|
+
{%- endif %}
|
|
191
|
+
|
|
192
|
+
from {% if dimension_refs %}with_dimensions{% else %}source_data{% endif %}
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
select * from final
|
|
196
|
+
`,
|
|
197
|
+
},
|
|
198
|
+
// Test template
|
|
199
|
+
{
|
|
200
|
+
name: "generic-test",
|
|
201
|
+
version: "1.0.0",
|
|
202
|
+
description: "Generic data quality test",
|
|
203
|
+
category: "test",
|
|
204
|
+
variables: [
|
|
205
|
+
{ name: "test_name", type: "string", required: true, description: "Name of the test" },
|
|
206
|
+
{ name: "model", type: "string", required: true, description: "Model to test" },
|
|
207
|
+
{ name: "column", type: "string", required: false, description: "Column to test" },
|
|
208
|
+
{ name: "condition", type: "string", required: true, description: "Test condition" },
|
|
209
|
+
{ name: "severity", type: "string", required: false, default: "error", description: "Test severity" },
|
|
210
|
+
],
|
|
211
|
+
content: `{{/*
|
|
212
|
+
Custom Test: {{ test_name }}
|
|
213
|
+
Generated by DataChonk
|
|
214
|
+
*/}}
|
|
215
|
+
|
|
216
|
+
{{ config(severity='{{ severity | default: "error" }}') }}
|
|
217
|
+
|
|
218
|
+
with validation as (
|
|
219
|
+
select
|
|
220
|
+
{%- if column %}
|
|
221
|
+
{{ column }},
|
|
222
|
+
{%- endif %}
|
|
223
|
+
*
|
|
224
|
+
from {{ ref('{{ model }}') }}
|
|
225
|
+
where not ({{ condition }})
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
select * from validation
|
|
229
|
+
`,
|
|
230
|
+
},
|
|
231
|
+
// Snapshot template
|
|
232
|
+
{
|
|
233
|
+
name: "snapshot-template",
|
|
234
|
+
version: "1.0.0",
|
|
235
|
+
description: "dbt snapshot for tracking changes over time",
|
|
236
|
+
category: "snapshot",
|
|
237
|
+
variables: [
|
|
238
|
+
{ name: "snapshot_name", type: "string", required: true, description: "Snapshot name" },
|
|
239
|
+
{ name: "source_model", type: "string", required: true, description: "Source model or table" },
|
|
240
|
+
{ name: "unique_key", type: "string", required: true, description: "Unique key column" },
|
|
241
|
+
{ name: "strategy", type: "string", required: false, default: "timestamp", description: "Snapshot strategy" },
|
|
242
|
+
{ name: "updated_at", type: "string", required: false, default: "updated_at", description: "Updated at column" },
|
|
243
|
+
],
|
|
244
|
+
content: `{{/*
|
|
245
|
+
Snapshot: {{ snapshot_name }}
|
|
246
|
+
Strategy: {{ strategy | default: 'timestamp' }}
|
|
247
|
+
Generated by DataChonk
|
|
248
|
+
*/}}
|
|
249
|
+
|
|
250
|
+
{% snapshot {{ snapshot_name }} %}
|
|
251
|
+
|
|
252
|
+
{{ config(
|
|
253
|
+
target_schema='snapshots',
|
|
254
|
+
unique_key='{{ unique_key }}',
|
|
255
|
+
strategy='{{ strategy | default: "timestamp" }}',
|
|
256
|
+
{%- if strategy == 'check' %}
|
|
257
|
+
check_cols='all',
|
|
258
|
+
{%- else %}
|
|
259
|
+
updated_at='{{ updated_at | default: "updated_at" }}',
|
|
260
|
+
{%- endif %}
|
|
261
|
+
invalidate_hard_deletes=True
|
|
262
|
+
) }}
|
|
263
|
+
|
|
264
|
+
select * from {{ ref('{{ source_model }}') }}
|
|
265
|
+
|
|
266
|
+
{% endsnapshot %}
|
|
267
|
+
`,
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
// Template registry instance
|
|
271
|
+
let registry = null;
|
|
272
|
+
/**
|
|
273
|
+
* Initialize the template registry
|
|
274
|
+
*/
|
|
275
|
+
export function initTemplates() {
|
|
276
|
+
if (registry)
|
|
277
|
+
return registry;
|
|
278
|
+
registry = {
|
|
279
|
+
templates: new Map(),
|
|
280
|
+
customDir: TEMPLATE_DIRS.project,
|
|
281
|
+
builtInDir: TEMPLATE_DIRS.builtIn,
|
|
282
|
+
};
|
|
283
|
+
// Load built-in templates
|
|
284
|
+
for (const template of BUILT_IN_TEMPLATES) {
|
|
285
|
+
registry.templates.set(template.name, template);
|
|
286
|
+
}
|
|
287
|
+
// Load custom templates from project directory
|
|
288
|
+
loadCustomTemplates(TEMPLATE_DIRS.project);
|
|
289
|
+
loadCustomTemplates(TEMPLATE_DIRS.user);
|
|
290
|
+
return registry;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Load custom templates from a directory
|
|
294
|
+
*/
|
|
295
|
+
function loadCustomTemplates(dir) {
|
|
296
|
+
if (!existsSync(dir))
|
|
297
|
+
return;
|
|
298
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
299
|
+
for (const file of files) {
|
|
300
|
+
try {
|
|
301
|
+
const content = readFileSync(join(dir, file), "utf-8");
|
|
302
|
+
const template = JSON.parse(content);
|
|
303
|
+
if (isValidTemplate(template)) {
|
|
304
|
+
registry?.templates.set(template.name, template);
|
|
305
|
+
console.log(chalk.gray(`Loaded template: ${template.name}`));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
console.warn(chalk.yellow(`Failed to load template: ${file}`));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Validate template structure
|
|
315
|
+
*/
|
|
316
|
+
function isValidTemplate(obj) {
|
|
317
|
+
if (!obj || typeof obj !== "object")
|
|
318
|
+
return false;
|
|
319
|
+
const t = obj;
|
|
320
|
+
return (typeof t.name === "string" &&
|
|
321
|
+
typeof t.version === "string" &&
|
|
322
|
+
typeof t.content === "string" &&
|
|
323
|
+
typeof t.category === "string");
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get a template by name
|
|
327
|
+
*/
|
|
328
|
+
export function getTemplate(name) {
|
|
329
|
+
if (!registry)
|
|
330
|
+
initTemplates();
|
|
331
|
+
return registry?.templates.get(name) || null;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* List all available templates
|
|
335
|
+
*/
|
|
336
|
+
export function listTemplates(category) {
|
|
337
|
+
if (!registry)
|
|
338
|
+
initTemplates();
|
|
339
|
+
const templates = Array.from(registry?.templates.values() || []);
|
|
340
|
+
if (category) {
|
|
341
|
+
return templates.filter((t) => t.category === category);
|
|
342
|
+
}
|
|
343
|
+
return templates;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Render a template with variables
|
|
347
|
+
*/
|
|
348
|
+
export function renderTemplate(templateName, variables) {
|
|
349
|
+
const template = getTemplate(templateName);
|
|
350
|
+
if (!template) {
|
|
351
|
+
throw new Error(`Template not found: ${templateName}`);
|
|
352
|
+
}
|
|
353
|
+
// Simple variable substitution (for Jinja-like syntax)
|
|
354
|
+
let content = template.content;
|
|
355
|
+
// Replace {{ variable }} patterns
|
|
356
|
+
content = content.replace(/\{\{\s*(\w+)(?:\s*\|\s*default:\s*['"]([^'"]+)['"])?\s*\}\}/g, (match, varName, defaultValue) => {
|
|
357
|
+
const value = variables[varName];
|
|
358
|
+
if (value !== undefined) {
|
|
359
|
+
return String(value);
|
|
360
|
+
}
|
|
361
|
+
if (defaultValue !== undefined) {
|
|
362
|
+
return defaultValue;
|
|
363
|
+
}
|
|
364
|
+
// Check template variable defaults
|
|
365
|
+
const varDef = template.variables.find((v) => v.name === varName);
|
|
366
|
+
if (varDef?.default !== undefined) {
|
|
367
|
+
return String(varDef.default);
|
|
368
|
+
}
|
|
369
|
+
return match; // Keep original if no value
|
|
370
|
+
});
|
|
371
|
+
// Handle conditionals: {%- if condition %}...{%- endif %}
|
|
372
|
+
content = content.replace(/\{%-?\s*if\s+(\w+)\s*%\}([\s\S]*?)\{%-?\s*endif\s*%\}/g, (match, condition, body) => {
|
|
373
|
+
const value = variables[condition];
|
|
374
|
+
if (value && (Array.isArray(value) ? value.length > 0 : Boolean(value))) {
|
|
375
|
+
return body;
|
|
376
|
+
}
|
|
377
|
+
return "";
|
|
378
|
+
});
|
|
379
|
+
// Handle loops: {%- for item in array %}...{%- endfor %}
|
|
380
|
+
content = content.replace(/\{%-?\s*for\s+(\w+)\s+in\s+(\w+)\s*%\}([\s\S]*?)\{%-?\s*endfor\s*%\}/g, (match, itemName, arrayName, body) => {
|
|
381
|
+
const array = variables[arrayName];
|
|
382
|
+
if (!Array.isArray(array))
|
|
383
|
+
return "";
|
|
384
|
+
return array
|
|
385
|
+
.map((item, index) => {
|
|
386
|
+
let itemBody = body;
|
|
387
|
+
// Replace item references
|
|
388
|
+
if (typeof item === "string") {
|
|
389
|
+
itemBody = itemBody.replace(new RegExp(`\\{\\{\\s*${itemName}\\s*\\}\\}`, "g"), item);
|
|
390
|
+
}
|
|
391
|
+
else if (typeof item === "object" && item !== null) {
|
|
392
|
+
for (const [key, val] of Object.entries(item)) {
|
|
393
|
+
itemBody = itemBody.replace(new RegExp(`\\{\\{\\s*${itemName}\\.${key}\\s*\\}\\}`, "g"), String(val));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Replace loop variables
|
|
397
|
+
itemBody = itemBody.replace(/\{\{\s*loop\.index\s*\}\}/g, String(index + 1));
|
|
398
|
+
itemBody = itemBody.replace(/\{\{\s*loop\.last\s*\}\}/g, String(index === array.length - 1));
|
|
399
|
+
return itemBody;
|
|
400
|
+
})
|
|
401
|
+
.join("");
|
|
402
|
+
});
|
|
403
|
+
return content;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Save a custom template
|
|
407
|
+
*/
|
|
408
|
+
export function saveTemplate(template, location = "project") {
|
|
409
|
+
const dir = location === "project" ? TEMPLATE_DIRS.project : TEMPLATE_DIRS.user;
|
|
410
|
+
if (!existsSync(dir)) {
|
|
411
|
+
mkdirSync(dir, { recursive: true });
|
|
412
|
+
}
|
|
413
|
+
const path = join(dir, `${template.name}.json`);
|
|
414
|
+
writeFileSync(path, JSON.stringify(template, null, 2));
|
|
415
|
+
// Update registry
|
|
416
|
+
if (registry) {
|
|
417
|
+
registry.templates.set(template.name, template);
|
|
418
|
+
}
|
|
419
|
+
console.log(chalk.green(`Template saved: ${path}`));
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Delete a custom template
|
|
423
|
+
*/
|
|
424
|
+
export function deleteTemplate(name) {
|
|
425
|
+
for (const dir of [TEMPLATE_DIRS.project, TEMPLATE_DIRS.user]) {
|
|
426
|
+
const path = join(dir, `${name}.json`);
|
|
427
|
+
if (existsSync(path)) {
|
|
428
|
+
unlinkSync(path);
|
|
429
|
+
registry?.templates.delete(name);
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Print available templates
|
|
437
|
+
*/
|
|
438
|
+
export function printTemplates() {
|
|
439
|
+
if (!registry)
|
|
440
|
+
initTemplates();
|
|
441
|
+
const templates = listTemplates();
|
|
442
|
+
const categories = [...new Set(templates.map((t) => t.category))];
|
|
443
|
+
console.log(chalk.bold("\nAvailable Templates"));
|
|
444
|
+
console.log(chalk.gray("─".repeat(50)));
|
|
445
|
+
for (const category of categories) {
|
|
446
|
+
console.log(chalk.bold(`\n${category.charAt(0).toUpperCase() + category.slice(1)}:`));
|
|
447
|
+
const categoryTemplates = templates.filter((t) => t.category === category);
|
|
448
|
+
for (const template of categoryTemplates) {
|
|
449
|
+
console.log(` ${chalk.cyan(template.name)} - ${template.description}`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Helper to delete files (need to import)
|
|
454
|
+
function unlinkSync(path) {
|
|
455
|
+
const fs = require("fs");
|
|
456
|
+
fs.unlinkSync(path);
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAkC1B,qBAAqB;AACrB,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC;IAC5E,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC;IACvD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC;CAC/D,CAAC;AAEF,qBAAqB;AACrB,MAAM,kBAAkB,GAAe;IACrC,yBAAyB;IACzB;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC1F,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;YAC1F,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACrF,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE;YACjG,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE;SAC/G;QACD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCZ;KACE;IAED,2BAA2B;IAC3B;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,+CAA+C;QAC5D,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC1F,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC1F,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE;YAC7F,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACrG,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE;SAC/F;QACD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CZ;KACE;IAED,sBAAsB;IACtB;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,0CAA0C;QACvD,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE;YACtF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,0BAA0B,EAAE;YAC1F,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE;YAC7F,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE;YACjG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE;SACrF;QACD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DZ;KACE;IAED,gBAAgB;IAChB;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE;YACtF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;YAC/E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE;YAClF,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE;YACpF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE;SACtG;QACD,OAAO,EAAE;;;;;;;;;;;;;;;;;;CAkBZ;KACE;IAED,oBAAoB;IACpB;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;YACvF,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC9F,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACxF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE;YAC7G,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE;SACjH;QACD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBZ;KACE;CACF,CAAC;AAEF,6BAA6B;AAC7B,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,QAAQ,GAAG;QACT,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,SAAS,EAAE,aAAa,CAAC,OAAO;QAChC,UAAU,EAAE,aAAa,CAAC,OAAO;KAClC,CAAC;IAEF,0BAA0B;IAC1B,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QAC1C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,+CAA+C;IAC/C,mBAAmB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAExC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAE7B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAElE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;YAEjD,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,OAAO,CACL,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,QAAQ;QAAE,aAAa,EAAE,CAAC;IAC/B,OAAO,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,IAAI,CAAC,QAAQ;QAAE,aAAa,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAoB,EACpB,SAAkC;IAElC,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE/B,kCAAkC;IAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,8DAA8D,EACtF,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,mCAAmC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAClE,IAAI,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,4BAA4B;IAC5C,CAAC,CACF,CAAC;IAEF,0DAA0D;IAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wDAAwD,EACxD,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;IAEF,yDAAyD;IACzD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,uEAAuE,EACvE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,0BAA0B;YAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,aAAa,QAAQ,YAAY,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACxF,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACrD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,IAAI,MAAM,CAAC,aAAa,QAAQ,MAAM,GAAG,YAAY,EAAE,GAAG,CAAC,EAC3D,MAAM,CAAC,GAAG,CAAC,CACZ,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,yBAAyB;YACzB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7F,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC,CACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,WAA+B,SAAS;IACvF,MAAM,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;IAEhF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvD,kBAAkB;IAClB,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ;QAAE,aAAa,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAE3E,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@datachonk/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-powered dbt expert CLI - analyze, generate, and optimize your dbt projects",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"datachonk": "./dist/index.js",
|
|
9
|
+
"dchonk": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsx src/index.ts",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"lint": "eslint src/**/*.ts",
|
|
23
|
+
"prepublishOnly": "npm run build && npm run test"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"dbt",
|
|
30
|
+
"data",
|
|
31
|
+
"analytics",
|
|
32
|
+
"sql",
|
|
33
|
+
"cli",
|
|
34
|
+
"ai",
|
|
35
|
+
"data-modeling",
|
|
36
|
+
"snowflake",
|
|
37
|
+
"bigquery",
|
|
38
|
+
"redshift",
|
|
39
|
+
"databricks"
|
|
40
|
+
],
|
|
41
|
+
"author": "DataChonk",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/datachonk/datachonk-cli"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"chalk": "^5.3.0",
|
|
49
|
+
"commander": "^12.1.0",
|
|
50
|
+
"conf": "^12.0.0",
|
|
51
|
+
"glob": "^10.3.10",
|
|
52
|
+
"inquirer": "^9.2.15",
|
|
53
|
+
"js-yaml": "^4.1.0",
|
|
54
|
+
"ora": "^8.0.1",
|
|
55
|
+
"sql-formatter": "^15.3.0",
|
|
56
|
+
"table": "^6.8.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/inquirer": "^9.0.7",
|
|
60
|
+
"@types/js-yaml": "^4.0.9",
|
|
61
|
+
"@types/node": "^20.11.24",
|
|
62
|
+
"tsx": "^4.7.1",
|
|
63
|
+
"typescript": "^5.3.3",
|
|
64
|
+
"vitest": "^4.0.18"
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=18.0.0"
|
|
68
|
+
}
|
|
69
|
+
}
|