@ast-grep/create-lang 0.0.0-prerelease-1 → 0.0.0-prerelease-2
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 +10 -0
- package/package.json +7 -1
- package/template/.gitignore +30 -0
- package/template/.npmignore +0 -0
- package/index.d.ts +0 -1
- package/index.ts +0 -131
- package/tsconfig.json +0 -3
package/README.md
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ast-grep/create-lang",
|
|
3
|
-
"version": "0.0.0-prerelease-
|
|
3
|
+
"version": "0.0.0-prerelease-2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "index.js",
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
"bin": {
|
|
13
13
|
"create-lang": "index.js"
|
|
14
14
|
},
|
|
15
|
+
"files": [
|
|
16
|
+
"index.js",
|
|
17
|
+
"template/.gitignore",
|
|
18
|
+
"template/.npmignore",
|
|
19
|
+
"template"
|
|
20
|
+
],
|
|
15
21
|
"dependencies": {
|
|
16
22
|
"prompts": "2.4.2"
|
|
17
23
|
},
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Logs
|
|
2
|
+
logs
|
|
3
|
+
*.log
|
|
4
|
+
npm-debug.log*
|
|
5
|
+
yarn-debug.log*
|
|
6
|
+
yarn-error.log*
|
|
7
|
+
pnpm-debug.log*
|
|
8
|
+
lerna-debug.log*
|
|
9
|
+
|
|
10
|
+
node_modules
|
|
11
|
+
dist
|
|
12
|
+
dist-ssr
|
|
13
|
+
*.local
|
|
14
|
+
|
|
15
|
+
# Editor directories and files
|
|
16
|
+
.vscode/*
|
|
17
|
+
!.vscode/extensions.json
|
|
18
|
+
.idea
|
|
19
|
+
.DS_Store
|
|
20
|
+
*.suo
|
|
21
|
+
*.ntvs*
|
|
22
|
+
*.njsproj
|
|
23
|
+
*.sln
|
|
24
|
+
*.sw?
|
|
25
|
+
|
|
26
|
+
# ignore generated parser files
|
|
27
|
+
parser.so
|
|
28
|
+
type.d.ts
|
|
29
|
+
# do not include copied directories
|
|
30
|
+
src
|
|
File without changes
|
package/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/index.ts
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import prompts from 'prompts'
|
|
2
|
-
import path from 'node:path'
|
|
3
|
-
import fs from 'node:fs/promises'
|
|
4
|
-
import { execSync } from 'node:child_process'
|
|
5
|
-
|
|
6
|
-
function required(s: string): string | true {
|
|
7
|
-
if (s.length === 0) {
|
|
8
|
-
return 'This value is required'
|
|
9
|
-
}
|
|
10
|
-
return true
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// https://github.com/vitejs/vite/blob/76082e3d3033b09b02b6db64de6e36942593c753/packages/create-vite/src/index.ts#L557
|
|
14
|
-
function isValidPackageName(projectName: string) {
|
|
15
|
-
return /^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(
|
|
16
|
-
projectName,
|
|
17
|
-
) || 'Invalid package name'
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function askConfiguration() {
|
|
22
|
-
return prompts([
|
|
23
|
-
{
|
|
24
|
-
type: 'text',
|
|
25
|
-
name: 'name',
|
|
26
|
-
message: 'Language name',
|
|
27
|
-
validate: required,
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
type: 'text',
|
|
31
|
-
name: 'packageName',
|
|
32
|
-
message: 'Package name',
|
|
33
|
-
validate: isValidPackageName,
|
|
34
|
-
initial: (_, answers) => `my-dynamic-lang-${answers.name}`,
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
type: 'text',
|
|
38
|
-
name: 'treeSitterPackage',
|
|
39
|
-
message: 'Tree-sitter package to use',
|
|
40
|
-
validate: isValidPackageName,
|
|
41
|
-
initial: (_, answers) => `tree-sitter-${answers.name}`,
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
type: 'list',
|
|
45
|
-
name: 'extensions',
|
|
46
|
-
message: 'File extensions used by the language, comma separated',
|
|
47
|
-
separator: ',',
|
|
48
|
-
validate: required,
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
type: 'text',
|
|
52
|
-
name: 'expandoChar',
|
|
53
|
-
message: 'Expando char used in pattern',
|
|
54
|
-
initial: '$',
|
|
55
|
-
validate: (value) => {
|
|
56
|
-
return value.length === 1 ? true : 'Expando char must be a single character'
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
type: 'confirm',
|
|
61
|
-
name: 'includeDotFiles',
|
|
62
|
-
message: 'Include gitignore and npm publish files?',
|
|
63
|
-
initial: true,
|
|
64
|
-
}
|
|
65
|
-
], {
|
|
66
|
-
onCancel: () => {
|
|
67
|
-
process.exit(1)
|
|
68
|
-
}
|
|
69
|
-
})
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
type Answers = Awaited<ReturnType<typeof askConfiguration>>
|
|
73
|
-
|
|
74
|
-
function copyTemplate(targetDir: string, includeDotFiles: boolean) {
|
|
75
|
-
const templateDir = path.join(__dirname, 'template')
|
|
76
|
-
return fs.cp(templateDir, targetDir, {
|
|
77
|
-
recursive: true, // Copy all files and folders
|
|
78
|
-
// includes hidden files if `includeDotFiles` is true
|
|
79
|
-
filter: (src) => {
|
|
80
|
-
const basename = path.basename(src)
|
|
81
|
-
return includeDotFiles || !basename.startsWith('.')
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
async function renameFiles(dir: string, answer: Answers) {
|
|
87
|
-
const name: Record<string, string> = {
|
|
88
|
-
$$PACKAGE_NAME$$: answer.packageName,
|
|
89
|
-
$$NAME$$: answer.name,
|
|
90
|
-
$$TREE_SITTER_PACKAGE$$: answer.treeSitterPackage,
|
|
91
|
-
$$EXTENSIONS$$: JSON.stringify(answer.extensions),
|
|
92
|
-
$$EXPANDO_CHAR$$: answer.expandoChar,
|
|
93
|
-
}
|
|
94
|
-
for (const file of await fs.readdir(dir)) {
|
|
95
|
-
const filePath = path.join(dir, file)
|
|
96
|
-
const stats = await fs.stat(filePath)
|
|
97
|
-
if (stats.isDirectory()) {
|
|
98
|
-
renameFiles(filePath, answer)
|
|
99
|
-
} else {
|
|
100
|
-
const content = await fs.readFile(filePath, 'utf-8')
|
|
101
|
-
const newContent = content.replace(/(\$\$[A-Z_]+\$\$)/g, (match) => {
|
|
102
|
-
return name[match] || match
|
|
103
|
-
})
|
|
104
|
-
await fs.writeFile(filePath, newContent)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function installTreeSitterPackage(cwd: string, answer: Answers) {
|
|
109
|
-
console.log('Installing tree-sitter package...')
|
|
110
|
-
execSync(`pnpm install ${answer.treeSitterPackage} --save-dev --save-exact`, {
|
|
111
|
-
cwd,
|
|
112
|
-
})
|
|
113
|
-
console.log('Copying source code...')
|
|
114
|
-
execSync('pnpm run source', { cwd })
|
|
115
|
-
console.log('Compiling')
|
|
116
|
-
execSync('pnpm run build', { cwd })
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async function main() {
|
|
120
|
-
let cwd = process.cwd()
|
|
121
|
-
if (process.argv.length > 2) {
|
|
122
|
-
const targetDir = process.argv[2]
|
|
123
|
-
cwd = path.join(cwd, targetDir)
|
|
124
|
-
}
|
|
125
|
-
const config = await askConfiguration()
|
|
126
|
-
await copyTemplate(cwd, config.includeDotFiles)
|
|
127
|
-
await renameFiles(cwd, config)
|
|
128
|
-
installTreeSitterPackage(cwd, config)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
main()
|
package/tsconfig.json
DELETED