codz-cli 0.0.0-stage → 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/BETA.md +91 -0
- package/LICENSE +21 -0
- package/README.md +523 -2
- package/assets/gradle-wrapper/README.txt +2 -0
- package/assets/gradle-wrapper/gradle-wrapper.jar +0 -0
- package/assets/gradle-wrapper/gradlew +251 -0
- package/assets/gradle-wrapper/gradlew.bat +94 -0
- package/bin/codz.js +33 -0
- package/dist/adapters/android.js +321 -0
- package/dist/adapters/androidSetup.js +277 -0
- package/dist/adapters/common.js +114 -0
- package/dist/adapters/dartGen.js +83 -0
- package/dist/adapters/flutter.js +291 -0
- package/dist/adapters/flutterGen.js +204 -0
- package/dist/adapters/flutterScan.js +312 -0
- package/dist/adapters/flutterSetup.js +252 -0
- package/dist/adapters/flutterStyles.js +130 -0
- package/dist/adapters/generic.js +20 -0
- package/dist/adapters/getx.js +423 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/ios.js +440 -0
- package/dist/adapters/kotlinGen.js +110 -0
- package/dist/adapters/models.js +116 -0
- package/dist/adapters/nextjs.js +243 -0
- package/dist/adapters/nextjsGen.js +285 -0
- package/dist/adapters/nextjsScan.js +364 -0
- package/dist/adapters/nextjsSetup.js +119 -0
- package/dist/adapters/react.js +89 -0
- package/dist/adapters/reactNative.js +109 -0
- package/dist/adapters/reactNativeSetup.js +236 -0
- package/dist/adapters/reactQuery.js +89 -0
- package/dist/adapters/reactSetup.js +150 -0
- package/dist/adapters/source.js +165 -0
- package/dist/cli.js +1175 -0
- package/dist/core/cache.js +76 -0
- package/dist/core/changeset.js +404 -0
- package/dist/core/commands.js +239 -0
- package/dist/core/config.js +45 -0
- package/dist/core/diff.js +143 -0
- package/dist/core/events.js +41 -0
- package/dist/core/fsutil.js +122 -0
- package/dist/core/git.js +36 -0
- package/dist/core/jsonEdit.js +113 -0
- package/dist/core/merge.js +159 -0
- package/dist/core/proc.js +23 -0
- package/dist/core/safe.js +75 -0
- package/dist/core/templates.js +100 -0
- package/dist/core/tsAst.js +112 -0
- package/dist/core/types.js +12 -0
- package/dist/core/validateConfig.js +172 -0
- package/dist/core/workflow.js +72 -0
- package/dist/core/workspace.js +80 -0
- package/dist/core/yaml.js +126 -0
- package/dist/core/yamlDoc.js +367 -0
- package/dist/detector.js +95 -0
- package/dist/input/apiSpec.js +395 -0
- package/dist/input/curl.js +259 -0
- package/dist/input/endpoint.js +220 -0
- package/dist/input/har.js +120 -0
- package/dist/input/infer.js +174 -0
- package/dist/input/naming.js +145 -0
- package/dist/input/paste.js +130 -0
- package/dist/skills/androidSkeleton.js +292 -0
- package/dist/skills/androidTests.js +221 -0
- package/dist/skills/androidUi.js +561 -0
- package/dist/skills/androidViews.js +536 -0
- package/dist/skills/apiAdd.js +99 -0
- package/dist/skills/apiDiff.js +271 -0
- package/dist/skills/apiEdit.js +547 -0
- package/dist/skills/apiImport.js +127 -0
- package/dist/skills/apiList.js +35 -0
- package/dist/skills/apiSync.js +221 -0
- package/dist/skills/auth.js +1304 -0
- package/dist/skills/completion.js +142 -0
- package/dist/skills/config.js +93 -0
- package/dist/skills/create.js +358 -0
- package/dist/skills/doctor.js +304 -0
- package/dist/skills/doctorFix.js +214 -0
- package/dist/skills/explain.js +61 -0
- package/dist/skills/feature.js +418 -0
- package/dist/skills/featureEdit.js +225 -0
- package/dist/skills/featureLinks.js +179 -0
- package/dist/skills/init.js +66 -0
- package/dist/skills/iosUi.js +468 -0
- package/dist/skills/locale.js +335 -0
- package/dist/skills/mcp.js +175 -0
- package/dist/skills/mock.js +482 -0
- package/dist/skills/module.js +23 -0
- package/dist/skills/plans.js +66 -0
- package/dist/skills/prefill.js +84 -0
- package/dist/skills/reactNativeUi.js +388 -0
- package/dist/skills/reactUi.js +352 -0
- package/dist/skills/report.js +75 -0
- package/dist/skills/route.js +230 -0
- package/dist/skills/screen.js +597 -0
- package/dist/skills/screenForm.js +410 -0
- package/dist/skills/setup.js +28 -0
- package/dist/skills/setupDoctor.js +226 -0
- package/dist/skills/templatesCmd.js +32 -0
- package/dist/skills/testgen.js +331 -0
- package/dist/skills/theme.js +388 -0
- package/dist/starters/auth.js +144 -0
- package/dist/starters/commands.js +283 -0
- package/dist/starters/engine.js +315 -0
- package/dist/starters/home.js +42 -0
- package/dist/starters/http.js +93 -0
- package/dist/starters/manifest.js +285 -0
- package/dist/starters/paths.js +70 -0
- package/dist/starters/publish.js +150 -0
- package/dist/starters/registry.js +258 -0
- package/dist/starters/sign.js +72 -0
- package/dist/starters/source.js +98 -0
- package/dist/starters/strictJson.js +148 -0
- package/dist/starters/tar.js +180 -0
- package/docs/COMMANDS.md +527 -0
- package/examples/openapi.yaml +319 -0
- package/package.json +57 -4
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Small, careful source-text helpers for TypeScript and Dart. They skip
|
|
2
|
+
// strings, template literals and comments, so braces inside them never
|
|
3
|
+
// confuse the scanner or the editor.
|
|
4
|
+
/** Returns the index of the brace that closes the one at `open`, or -1. */
|
|
5
|
+
export function matchBrace(text, open, lang = 'ts') {
|
|
6
|
+
const openCh = text[open];
|
|
7
|
+
const closeCh = openCh === '{' ? '}' : openCh === '(' ? ')' : openCh === '[' ? ']' : '';
|
|
8
|
+
if (!closeCh)
|
|
9
|
+
return -1;
|
|
10
|
+
let depth = 0;
|
|
11
|
+
let i = open;
|
|
12
|
+
while (i < text.length) {
|
|
13
|
+
const c = text[i];
|
|
14
|
+
const n = text[i + 1];
|
|
15
|
+
if (c === '/' && n === '/') {
|
|
16
|
+
const end = text.indexOf('\n', i);
|
|
17
|
+
i = end === -1 ? text.length : end;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (c === '/' && n === '*') {
|
|
21
|
+
const end = text.indexOf('*/', i + 2);
|
|
22
|
+
i = end === -1 ? text.length : end + 2;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (c === "'" || c === '"' || c === '`') {
|
|
26
|
+
i = skipString(text, i, lang);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (c === openCh)
|
|
30
|
+
depth++;
|
|
31
|
+
else if (c === closeCh) {
|
|
32
|
+
depth--;
|
|
33
|
+
if (depth === 0)
|
|
34
|
+
return i;
|
|
35
|
+
}
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
return -1;
|
|
39
|
+
}
|
|
40
|
+
/** Returns the index just after the string starting at `start`. */
|
|
41
|
+
export function skipString(text, start, lang) {
|
|
42
|
+
const q = text[start];
|
|
43
|
+
// Dart raw strings r'...' are handled by the caller treating r as a normal char; escapes in them are rare.
|
|
44
|
+
const triple = lang === 'dart' && text.slice(start, start + 3) === q.repeat(3);
|
|
45
|
+
const interp = q === '`' || lang === 'dart';
|
|
46
|
+
let i = start + (triple ? 3 : 1);
|
|
47
|
+
while (i < text.length) {
|
|
48
|
+
const c = text[i];
|
|
49
|
+
if (c === '\\') {
|
|
50
|
+
i += 2;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (interp && c === '$' && text[i + 1] === '{') {
|
|
54
|
+
const end = matchBrace(text, i + 1, lang);
|
|
55
|
+
i = end === -1 ? text.length : end + 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (triple ? text.slice(i, i + 3) === q.repeat(3) : c === q)
|
|
59
|
+
return i + (triple ? 3 : 1);
|
|
60
|
+
if (!triple && c === '\n' && q !== '`')
|
|
61
|
+
return i; // unterminated single-line string
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
return text.length;
|
|
65
|
+
}
|
|
66
|
+
/** Detects the indentation unit (two spaces, four spaces or a tab) used in a file. */
|
|
67
|
+
export function detectIndent(text) {
|
|
68
|
+
const counts = new Map();
|
|
69
|
+
for (const line of text.split('\n')) {
|
|
70
|
+
const m = line.match(/^( +|\t+)\S/);
|
|
71
|
+
if (!m)
|
|
72
|
+
continue;
|
|
73
|
+
const ws = m[1];
|
|
74
|
+
if (ws[0] === '\t')
|
|
75
|
+
counts.set('\t', (counts.get('\t') ?? 0) + 1);
|
|
76
|
+
else if (ws.length % 4 === 0 && ws.length <= 8)
|
|
77
|
+
counts.set(' ', (counts.get(' ') ?? 0) + 1);
|
|
78
|
+
else if (ws.length % 2 === 0)
|
|
79
|
+
counts.set(' ', (counts.get(' ') ?? 0) + 1);
|
|
80
|
+
}
|
|
81
|
+
if ((counts.get('\t') ?? 0) > (counts.get(' ') ?? 0) + (counts.get(' ') ?? 0))
|
|
82
|
+
return '\t';
|
|
83
|
+
// Lines indented by 4 are also multiples of 2; prefer 2 when any 2-only line exists.
|
|
84
|
+
return (counts.get(' ') ?? 0) > 0 ? ' ' : (counts.get(' ') ?? 0) > 0 ? ' ' : ' ';
|
|
85
|
+
}
|
|
86
|
+
export function detectTsStyle(samples) {
|
|
87
|
+
let single = 0;
|
|
88
|
+
let double = 0;
|
|
89
|
+
let semis = 0;
|
|
90
|
+
let noSemis = 0;
|
|
91
|
+
for (const text of samples) {
|
|
92
|
+
single += (text.match(/^import .* from '/gm) ?? []).length + (text.match(/'[^'\n]*'/g) ?? []).length / 4;
|
|
93
|
+
double += (text.match(/^import .* from "/gm) ?? []).length + (text.match(/"[^"\n]*"/g) ?? []).length / 4;
|
|
94
|
+
for (const line of text.split('\n')) {
|
|
95
|
+
const t = line.trim();
|
|
96
|
+
if (/^(import|export|const|let|return|throw)\b/.test(t) && !t.endsWith('{') && !t.endsWith('(') && !t.endsWith(',') && !t.endsWith('[')) {
|
|
97
|
+
if (t.endsWith(';'))
|
|
98
|
+
semis++;
|
|
99
|
+
else
|
|
100
|
+
noSemis++;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const indent = samples.length ? detectIndent(samples.join('\n')) : ' ';
|
|
105
|
+
return { quote: double > single ? '"' : "'", semi: noSemis <= semis, indent };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The text with comments and string contents replaced by spaces (same length,
|
|
109
|
+
* same line breaks), so searches for identifiers only hit real code. Quotes stay;
|
|
110
|
+
* code inside `${...}` interpolation stays visible.
|
|
111
|
+
*/
|
|
112
|
+
export function maskCode(text, lang) {
|
|
113
|
+
const out = text.split('');
|
|
114
|
+
const blank = (from, to) => {
|
|
115
|
+
for (let k = from; k < to; k++)
|
|
116
|
+
if (out[k] !== '\n')
|
|
117
|
+
out[k] = ' ';
|
|
118
|
+
};
|
|
119
|
+
let i = 0;
|
|
120
|
+
while (i < text.length) {
|
|
121
|
+
const c = text[i];
|
|
122
|
+
const n = text[i + 1];
|
|
123
|
+
if (c === '/' && n === '/') {
|
|
124
|
+
const end = text.indexOf('\n', i);
|
|
125
|
+
const stop = end === -1 ? text.length : end;
|
|
126
|
+
blank(i, stop);
|
|
127
|
+
i = stop;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (c === '/' && n === '*') {
|
|
131
|
+
const end = text.indexOf('*/', i + 2);
|
|
132
|
+
const stop = end === -1 ? text.length : end + 2;
|
|
133
|
+
blank(i, stop);
|
|
134
|
+
i = stop;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (c === "'" || c === '"' || c === '`') {
|
|
138
|
+
const end = skipString(text, i, lang);
|
|
139
|
+
const triple = lang === 'dart' && text.slice(i, i + 3) === c.repeat(3);
|
|
140
|
+
const q = triple ? 3 : 1;
|
|
141
|
+
// Blank the contents, but keep ${...} expressions as code.
|
|
142
|
+
let k = i + q;
|
|
143
|
+
const stop = Math.max(k, end - q);
|
|
144
|
+
while (k < stop) {
|
|
145
|
+
if ((c === '`' || lang === 'dart') && text[k] === '$' && text[k + 1] === '{') {
|
|
146
|
+
const close = matchBrace(text, k + 1, lang);
|
|
147
|
+
if (close !== -1 && close < stop) {
|
|
148
|
+
const inner = maskCode(text.slice(k + 2, close), lang);
|
|
149
|
+
for (let j = 0; j < inner.length; j++)
|
|
150
|
+
out[k + 2 + j] = inner[j];
|
|
151
|
+
k = close + 1;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (text[k] !== '\n')
|
|
156
|
+
out[k] = ' ';
|
|
157
|
+
k++;
|
|
158
|
+
}
|
|
159
|
+
i = end;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
i++;
|
|
163
|
+
}
|
|
164
|
+
return out.join('');
|
|
165
|
+
}
|