@fragno-dev/create 0.0.2 → 0.0.4
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/.turbo/turbo-build.log +7 -7
- package/.turbo/turbo-test.log +32 -32
- package/CHANGELOG.md +13 -0
- package/dist/index.d.ts +41 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -8
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +2 -2
- package/src/index.ts +40 -11
- package/src/integration.test.ts +6 -0
- package/templates/fragment/package.template.json +11 -2
- package/templates/fragment/src/client/solid.ts +7 -0
- package/templates/fragment/src/index.ts +9 -18
- package/templates/optional/builder/tsdown.config.ts +1 -0
- /package/templates/{fragment → optional/agent}/AGENTS.md +0 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
$ tsdown
|
|
2
|
-
[34mℹ[39m tsdown [2mv0.15.
|
|
2
|
+
[34mℹ[39m tsdown [2mv0.15.9[22m powered by rolldown [2mv1.0.0-beta.44[22m
|
|
3
3
|
[34mℹ[39m Using tsdown config: [4m/home/runner/work/fragno/fragno/packages/create/tsdown.config.ts[24m
|
|
4
4
|
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
5
5
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
6
6
|
[34mℹ[39m Build start
|
|
7
|
-
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [
|
|
8
|
-
[34mℹ[39m [2mdist/[22mindex.js.map [
|
|
9
|
-
[34mℹ[39m [2mdist/[22mindex.d.ts.map [
|
|
10
|
-
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [
|
|
11
|
-
[34mℹ[39m 4 files, total:
|
|
12
|
-
[32m✔[39m Build complete in [
|
|
7
|
+
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m 5.15 kB[22m [2m│ gzip: 1.70 kB[22m
|
|
8
|
+
[34mℹ[39m [2mdist/[22mindex.js.map [2m10.09 kB[22m [2m│ gzip: 3.07 kB[22m
|
|
9
|
+
[34mℹ[39m [2mdist/[22mindex.d.ts.map [2m 0.58 kB[22m [2m│ gzip: 0.31 kB[22m
|
|
10
|
+
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [2m 1.25 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
11
|
+
[34mℹ[39m 4 files, total: 17.08 kB
|
|
12
|
+
[32m✔[39m Build complete in [32m2604ms[39m
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -3,64 +3,64 @@ $ vitest run
|
|
|
3
3
|
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/fragno/fragno/packages/create[39m
|
|
4
4
|
[2mCoverage enabled with [22m[33mistanbul[39m
|
|
5
5
|
|
|
6
|
-
[32m✓[39m src/utils.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
6
|
+
[32m✓[39m src/utils.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
7
7
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with rspack
|
|
8
|
-
[22m[39mtemp /tmp/fragment-test-tsdown-
|
|
8
|
+
[22m[39mtemp /tmp/fragment-test-tsdown-1760972394592
|
|
9
9
|
|
|
10
10
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with tsdown[2m > [22m[2mpackage.json correctly templated
|
|
11
|
-
[22m[39mtemp /tmp/fragment-test-esbuild-
|
|
11
|
+
[22m[39mtemp /tmp/fragment-test-esbuild-1760972394596
|
|
12
12
|
|
|
13
13
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with esbuild[2m > [22m[2mpackage.json correctly templated
|
|
14
|
-
[22m[39mtemp /tmp/fragment-test-vite-
|
|
14
|
+
[22m[39mtemp /tmp/fragment-test-vite-1760972394596
|
|
15
15
|
|
|
16
16
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with vite[2m > [22m[2mpackage.json correctly templated
|
|
17
|
-
[22m[39mtemp /tmp/fragment-test-rollup-
|
|
17
|
+
[22m[39mtemp /tmp/fragment-test-rollup-1760972394596
|
|
18
18
|
|
|
19
19
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with rollup[2m > [22m[2mpackage.json correctly templated
|
|
20
|
-
[22m[39mtemp /tmp/fragment-test-webpack-
|
|
20
|
+
[22m[39mtemp /tmp/fragment-test-webpack-1760972394597
|
|
21
21
|
|
|
22
22
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with webpack[2m > [22m[2mpackage.json correctly templated
|
|
23
|
-
[22m[39mtemp /tmp/fragment-test-rspack-
|
|
23
|
+
[22m[39mtemp /tmp/fragment-test-rspack-1760972394597
|
|
24
24
|
|
|
25
|
-
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with
|
|
25
|
+
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with webpack[2m > [22m[2mcompiles
|
|
26
26
|
[22m[39m
|
|
27
27
|
|
|
28
28
|
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with rspack[2m > [22m[2mcompiles
|
|
29
29
|
[22m[39m
|
|
30
30
|
|
|
31
|
-
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with
|
|
31
|
+
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with rollup
|
|
32
32
|
[22m[39m
|
|
33
33
|
|
|
34
|
-
[90mstdout[2m | src/integration.test.ts
|
|
34
|
+
[90mstdout[2m | src/integration.test.ts
|
|
35
35
|
[22m[39m
|
|
36
36
|
|
|
37
37
|
[90mstdout[2m | src/integration.test.ts
|
|
38
38
|
[22m[39m
|
|
39
39
|
|
|
40
|
-
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with
|
|
40
|
+
[90mstdout[2m | src/integration.test.ts[2m > [22m[2mfragment with webpack[2m > [22m[2mbuilds
|
|
41
41
|
[22m[39m
|
|
42
42
|
|
|
43
|
-
[32m✓[39m src/integration.test.ts [2m([22m[
|
|
44
|
-
[33m[2m✓[22m[39m fragment with tsdown[2m > [22minstalls [33m
|
|
45
|
-
[33m[2m✓[22m[39m fragment with tsdown[2m > [22mcompiles [33m
|
|
46
|
-
[33m[2m✓[22m[39m fragment with tsdown[2m > [22mbuilds [33m
|
|
47
|
-
[33m[2m✓[22m[39m fragment with esbuild[2m > [22minstalls [33m
|
|
48
|
-
[33m[2m✓[22m[39m fragment with esbuild[2m > [22mcompiles [33m
|
|
49
|
-
[33m[2m✓[22m[39m fragment with esbuild[2m > [22mbuilds [33m
|
|
50
|
-
[33m[2m✓[22m[39m fragment with vite[2m > [22minstalls [33m
|
|
51
|
-
[33m[2m✓[22m[39m fragment with vite[2m > [22mcompiles [33m
|
|
52
|
-
[33m[2m✓[22m[39m fragment with vite[2m > [22mbuilds [33m
|
|
53
|
-
[33m[2m✓[22m[39m fragment with rollup[2m > [22minstalls [33m
|
|
54
|
-
[33m[2m✓[22m[39m fragment with rollup[2m > [22mcompiles [33m
|
|
55
|
-
[33m[2m✓[22m[39m fragment with webpack[2m > [22minstalls [33m
|
|
56
|
-
[33m[2m✓[22m[39m fragment with webpack[2m > [22mcompiles [33m
|
|
57
|
-
[33m[2m✓[22m[39m fragment with webpack[2m > [22mbuilds [33m
|
|
58
|
-
[33m[2m✓[22m[39m fragment with rspack[2m > [22minstalls [33m
|
|
59
|
-
[33m[2m✓[22m[39m fragment with rspack[2m > [22mcompiles [33m
|
|
60
|
-
[33m[2m✓[22m[39m fragment with rspack[2m > [22mbuilds [33m
|
|
43
|
+
[32m✓[39m src/integration.test.ts [2m([22m[2m30 tests[22m[2m | [22m[33m1 skipped[39m[2m)[22m[33m 24967[2mms[22m[39m
|
|
44
|
+
[33m[2m✓[22m[39m fragment with tsdown[2m > [22minstalls [33m 2596[2mms[22m[39m
|
|
45
|
+
[33m[2m✓[22m[39m fragment with tsdown[2m > [22mcompiles [33m 7152[2mms[22m[39m
|
|
46
|
+
[33m[2m✓[22m[39m fragment with tsdown[2m > [22mbuilds [33m 9413[2mms[22m[39m
|
|
47
|
+
[33m[2m✓[22m[39m fragment with esbuild[2m > [22minstalls [33m 2515[2mms[22m[39m
|
|
48
|
+
[33m[2m✓[22m[39m fragment with esbuild[2m > [22mcompiles [33m 6488[2mms[22m[39m
|
|
49
|
+
[33m[2m✓[22m[39m fragment with esbuild[2m > [22mbuilds [33m 1739[2mms[22m[39m
|
|
50
|
+
[33m[2m✓[22m[39m fragment with vite[2m > [22minstalls [33m 2517[2mms[22m[39m
|
|
51
|
+
[33m[2m✓[22m[39m fragment with vite[2m > [22mcompiles [33m 6562[2mms[22m[39m
|
|
52
|
+
[33m[2m✓[22m[39m fragment with vite[2m > [22mbuilds [33m 6624[2mms[22m[39m
|
|
53
|
+
[33m[2m✓[22m[39m fragment with rollup[2m > [22minstalls [33m 2570[2mms[22m[39m
|
|
54
|
+
[33m[2m✓[22m[39m fragment with rollup[2m > [22mcompiles [33m 6173[2mms[22m[39m
|
|
55
|
+
[33m[2m✓[22m[39m fragment with webpack[2m > [22minstalls [33m 2607[2mms[22m[39m
|
|
56
|
+
[33m[2m✓[22m[39m fragment with webpack[2m > [22mcompiles [33m 6274[2mms[22m[39m
|
|
57
|
+
[33m[2m✓[22m[39m fragment with webpack[2m > [22mbuilds [33m 13005[2mms[22m[39m
|
|
58
|
+
[33m[2m✓[22m[39m fragment with rspack[2m > [22minstalls [33m 3026[2mms[22m[39m
|
|
59
|
+
[33m[2m✓[22m[39m fragment with rspack[2m > [22mcompiles [33m 5303[2mms[22m[39m
|
|
60
|
+
[33m[2m✓[22m[39m fragment with rspack[2m > [22mbuilds [33m 3715[2mms[22m[39m
|
|
61
61
|
|
|
62
62
|
[2m Test Files [22m [1m[32m2 passed[39m[22m[90m (2)[39m
|
|
63
|
-
[2m Tests [22m [1m[
|
|
64
|
-
[2m Start at [22m
|
|
65
|
-
[2m Duration [22m
|
|
63
|
+
[2m Tests [22m [1m[32m30 passed[39m[22m[2m | [22m[33m1 skipped[39m[90m (31)[39m
|
|
64
|
+
[2m Start at [22m 14:59:53
|
|
65
|
+
[2m Duration [22m 25.62s[2m (transform 325ms, setup 0ms, collect 498ms, tests 24.97s, environment 0ms, prepare 179ms)[22m
|
|
66
66
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @fragno-dev/create
|
|
2
2
|
|
|
3
|
+
## 0.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 495c344: Add SolidJS to fragment template
|
|
8
|
+
|
|
9
|
+
## 0.0.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 6338460: template: make ai agent readme file configurable
|
|
14
|
+
- 89b7a62: Clarify config, dependency and service types in fragment template
|
|
15
|
+
|
|
3
16
|
## 0.0.2
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
//#region src/index.d.ts
|
|
2
|
-
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
declare const templateTypesSchema: z.ZodLiteral<"fragment">;
|
|
5
|
+
type TemplateTypes = z.infer<typeof templateTypesSchema>;
|
|
6
|
+
declare const buildToolsSchema: z.ZodEnum<{
|
|
7
|
+
esbuild: "esbuild";
|
|
8
|
+
tsdown: "tsdown";
|
|
9
|
+
vite: "vite";
|
|
10
|
+
rollup: "rollup";
|
|
11
|
+
webpack: "webpack";
|
|
12
|
+
rspack: "rspack";
|
|
13
|
+
none: "none";
|
|
14
|
+
}>;
|
|
15
|
+
type BuildTools = z.infer<typeof buildToolsSchema>;
|
|
16
|
+
declare const agentDocsSchema: z.ZodEnum<{
|
|
17
|
+
none: "none";
|
|
18
|
+
"AGENTS.md": "AGENTS.md";
|
|
19
|
+
"CLAUDE.md": "CLAUDE.md";
|
|
20
|
+
}>;
|
|
21
|
+
type AgentDocs = z.infer<typeof agentDocsSchema>;
|
|
22
|
+
declare const createOptionsSchema: z.ZodObject<{
|
|
23
|
+
path: z.ZodString;
|
|
24
|
+
buildTool: z.ZodEnum<{
|
|
25
|
+
esbuild: "esbuild";
|
|
26
|
+
tsdown: "tsdown";
|
|
27
|
+
vite: "vite";
|
|
28
|
+
rollup: "rollup";
|
|
29
|
+
webpack: "webpack";
|
|
30
|
+
rspack: "rspack";
|
|
31
|
+
none: "none";
|
|
32
|
+
}>;
|
|
33
|
+
name: z.ZodString;
|
|
34
|
+
template: z.ZodLiteral<"fragment">;
|
|
35
|
+
agentDocs: z.ZodEnum<{
|
|
36
|
+
none: "none";
|
|
37
|
+
"AGENTS.md": "AGENTS.md";
|
|
38
|
+
"CLAUDE.md": "CLAUDE.md";
|
|
39
|
+
}>;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
type CreateOptions = z.infer<typeof createOptionsSchema>;
|
|
10
42
|
declare function create(options: CreateOptions): void;
|
|
11
43
|
//#endregion
|
|
12
|
-
export { BuildTools, create };
|
|
44
|
+
export { AgentDocs, BuildTools, TemplateTypes, create, createOptionsSchema };
|
|
13
45
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;cAOM,qBAAmB,CAAA,CAAA;KACb,aAAA,GAAgB,CAAA,CAAE,aAAa;AAHnB,cAKlB,gBAH2C,EAG3B,CAAA,CAAA,OAHG,CAAA;EACb,OAAA,EAAA,SAAa;EAEnB,MAAA,EAAA,QAAA;EASM,IAAA,EAAA,MAAA;EAEN,MAAA,EAAA,QAAA;EACM,OAAA,EAAA,SAAS;EAER,MAAA,EAAA,QAAA;;;KALD,UAAA,GAAa,CAAA,CAAE,aAAa;cAElC,iBAAe,CAAA,CAAA;;;EAGW,WAAA,EAAA,WAAA;CAAA,CAAA;AAQ3B,KAVO,SAAA,GAAY,CAAA,CAAE,KAUU,CAAA,OAVG,eAUhB,CAAA;AAEP,cAVH,mBAUgC,EAVb,CAAA,CAAA,SAUa,CAAA;;;;;;;;;;;;;;;;;;;KAFxC,aAAA,GAAgB,CAAA,CAAE,aAAa;iBAEpB,MAAA,UAAgB"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { z } from "zod";
|
|
4
5
|
|
|
5
6
|
//#region src/utils.ts
|
|
6
7
|
function mkdirp(dir) {
|
|
@@ -101,6 +102,28 @@ const buildToolPkg = {
|
|
|
101
102
|
|
|
102
103
|
//#endregion
|
|
103
104
|
//#region src/index.ts
|
|
105
|
+
const templateTypesSchema = z.literal("fragment");
|
|
106
|
+
const buildToolsSchema = z.enum([
|
|
107
|
+
"esbuild",
|
|
108
|
+
"tsdown",
|
|
109
|
+
"vite",
|
|
110
|
+
"rollup",
|
|
111
|
+
"webpack",
|
|
112
|
+
"rspack",
|
|
113
|
+
"none"
|
|
114
|
+
]);
|
|
115
|
+
const agentDocsSchema = z.enum([
|
|
116
|
+
"AGENTS.md",
|
|
117
|
+
"CLAUDE.md",
|
|
118
|
+
"none"
|
|
119
|
+
]);
|
|
120
|
+
const createOptionsSchema = z.object({
|
|
121
|
+
path: z.string(),
|
|
122
|
+
buildTool: buildToolsSchema,
|
|
123
|
+
name: z.string(),
|
|
124
|
+
template: templateTypesSchema,
|
|
125
|
+
agentDocs: agentDocsSchema
|
|
126
|
+
});
|
|
104
127
|
function create(options) {
|
|
105
128
|
let pkgOverride = { name: options.name };
|
|
106
129
|
pkgOverride = merge(pkgOverride, buildToolPkg[options.buildTool]);
|
|
@@ -127,28 +150,35 @@ function create(options) {
|
|
|
127
150
|
break;
|
|
128
151
|
case "none": break;
|
|
129
152
|
}
|
|
153
|
+
switch (options.agentDocs) {
|
|
154
|
+
case "AGENTS.md":
|
|
155
|
+
writeOptionalTemplate(options.path, "agent/AGENTS.md");
|
|
156
|
+
break;
|
|
157
|
+
case "CLAUDE.md":
|
|
158
|
+
writeOptionalTemplate(options.path, "agent/AGENTS.md", "CLAUDE.md");
|
|
159
|
+
break;
|
|
160
|
+
case "none": break;
|
|
161
|
+
}
|
|
130
162
|
}
|
|
131
163
|
function getTemplateDir() {
|
|
132
164
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
133
165
|
return path.join(__dirname, "..", "templates");
|
|
134
166
|
}
|
|
135
|
-
function writeOptionalTemplate(targetPath, template) {
|
|
167
|
+
function writeOptionalTemplate(targetPath, template, rename) {
|
|
136
168
|
const templatePath = path.join(getTemplateDir(), "optional", template);
|
|
137
|
-
const
|
|
138
|
-
copy(templatePath,
|
|
169
|
+
const targetFileName = rename ? rename : path.basename(template);
|
|
170
|
+
copy(templatePath, path.join(targetPath, targetFileName));
|
|
139
171
|
}
|
|
140
172
|
function writeFragmentTemplate(targetPath, pkgOverrides) {
|
|
141
|
-
|
|
142
|
-
copy(templateDir, targetPath, (basename) => {
|
|
173
|
+
copy(path.join(getTemplateDir(), "fragment"), targetPath, (basename) => {
|
|
143
174
|
if (basename === "package.template.json") return "package.json";
|
|
144
175
|
return basename;
|
|
145
176
|
});
|
|
146
177
|
const packageJsonPath = path.join(targetPath, "package.json");
|
|
147
|
-
const
|
|
148
|
-
const newPkg = merge(basePkg, pkgOverrides);
|
|
178
|
+
const newPkg = merge(JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")), pkgOverrides);
|
|
149
179
|
fs.writeFileSync(packageJsonPath, JSON.stringify(newPkg, null, 2) + "\n");
|
|
150
180
|
}
|
|
151
181
|
|
|
152
182
|
//#endregion
|
|
153
|
-
export { create };
|
|
183
|
+
export { create, createOptionsSchema };
|
|
154
184
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["e: unknown","buildToolPkg: Record<BuildTools, Record<string, unknown>>","pkgOverride: Record<string, unknown>"],"sources":["../src/utils.ts","../src/package-json.ts","../src/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function mkdirp(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (e: unknown) {\n if (e instanceof Error && \"code\" in e && e.code === \"EEXIST\") return;\n throw e;\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === \"[object Object]\"\n );\n}\n\n/**\n * Deep merge plain objects. Arrays and primitives are overwritten, not merged.\n * @param target The target object\n * @param source The source object\n * @returns The merged object\n */\nexport function merge<T extends Record<string, unknown>>(\n target: T,\n source: Record<string, unknown>,\n): T {\n const result = { ...target } as Record<string, unknown>;\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (isPlainObject(sourceValue) && isPlainObject(targetValue)) {\n result[key] = merge(targetValue, sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n\n return result as T;\n}\n\nfunction identity<T>(x: T): T {\n return x;\n}\n\nexport function copy(\n from: string,\n to: string,\n rename: (basename: string) => string = identity,\n): void {\n if (!fs.existsSync(from)) return;\n\n const stats = fs.statSync(from);\n\n if (stats.isDirectory()) {\n fs.readdirSync(from).forEach((file) => {\n copy(path.join(from, file), path.join(to, rename(file)));\n });\n } else {\n mkdirp(path.dirname(to));\n fs.copyFileSync(from, to);\n }\n}\n","import type { BuildTools } from \"./index\";\n\nconst unpluginFragnoVersion = \"^0.0.1\";\n\nexport const buildToolPkg: Record<BuildTools, Record<string, unknown>> = {\n none: {},\n tsdown: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n tsdown: \"^0.11.9\",\n },\n scripts: {\n build: \"tsdown\",\n },\n },\n esbuild: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n esbuild: \"^0.25.10\",\n },\n scripts: {\n build: \"./esbuild.config.js\",\n },\n },\n vite: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n vite: \"^6.0.0\",\n },\n scripts: {\n build: \"vite build\",\n },\n },\n rollup: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n \"@rollup/plugin-node-resolve\": \"^16.0.2\",\n \"@rollup/plugin-typescript\": \"^12.1.4\",\n tslib: \"^2.8.1\",\n rollup: \"^4.52.4\",\n },\n scripts: {\n build: \"rollup -c\",\n },\n },\n webpack: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n webpack: \"^5.102.0\",\n \"webpack-cli\": \"^6.0.1\",\n \"ts-loader\": \"^9.5.1\",\n },\n scripts: {\n build: \"webpack\",\n },\n },\n rspack: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n \"@rspack/core\": \"^1.5.8\",\n \"@rspack/cli\": \"^1.5.8\",\n },\n scripts: {\n build: \"rspack build\",\n },\n },\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { copy, merge } from \"./utils.ts\";\nimport { buildToolPkg } from \"./package-json.ts\";\n\ntype TemplateTypes = \"fragment\";\n// TODO: the others\nexport type BuildTools = \"esbuild\" | \"tsdown\" | \"vite\" | \"rollup\" | \"webpack\" | \"rspack\" | \"none\";\n\ninterface CreateOptions {\n path: string;\n buildTool: BuildTools;\n name: string;\n template: TemplateTypes;\n}\n\nexport function create(options: CreateOptions) {\n let pkgOverride: Record<string, unknown> = { name: options.name };\n\n // Build tool pkg overrides\n pkgOverride = merge(pkgOverride, buildToolPkg[options.buildTool]);\n\n if (options.template == \"fragment\") {\n writeFragmentTemplate(options.path, pkgOverride);\n } else {\n throw new Error(`Unsupported template type: ${options.template}`);\n }\n\n switch (options.buildTool) {\n case \"esbuild\":\n writeOptionalTemplate(options.path, \"builder/esbuild.config.js\");\n break;\n case \"tsdown\":\n writeOptionalTemplate(options.path, \"builder/tsdown.config.ts\");\n break;\n case \"vite\":\n writeOptionalTemplate(options.path, \"builder/vite.config.ts\");\n break;\n case \"rollup\":\n writeOptionalTemplate(options.path, \"builder/rollup.config.js\");\n break;\n case \"webpack\":\n writeOptionalTemplate(options.path, \"builder/webpack.config.js\");\n break;\n case \"rspack\":\n writeOptionalTemplate(options.path, \"builder/rspack.config.js\");\n break;\n case \"none\":\n break;\n }\n}\n\nfunction getTemplateDir(): string {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n return path.join(__dirname, \"..\", \"templates\");\n}\n\nfunction writeOptionalTemplate(targetPath: string, template: string) {\n const templatePath = path.join(getTemplateDir(), \"optional\", template);\n const targetFile = path.join(targetPath, path.basename(template));\n\n copy(templatePath, targetFile);\n}\n\nfunction writeFragmentTemplate(targetPath: string, pkgOverrides: Record<string, unknown>) {\n const templateDir = path.join(getTemplateDir(), \"fragment\");\n\n // Copy template files\n copy(templateDir, targetPath, (basename) => {\n if (basename === \"package.template.json\") {\n return \"package.json\";\n }\n return basename;\n });\n\n // Update package.json based on chosen options\n const packageJsonPath = path.join(targetPath, \"package.json\");\n const basePkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const newPkg = merge(basePkg, pkgOverrides);\n\n // Write to disk\n fs.writeFileSync(packageJsonPath, JSON.stringify(newPkg, null, 2) + \"\\n\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["e: unknown","buildToolPkg: Record<BuildTools, Record<string, unknown>>","pkgOverride: Record<string, unknown>"],"sources":["../src/utils.ts","../src/package-json.ts","../src/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function mkdirp(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (e: unknown) {\n if (e instanceof Error && \"code\" in e && e.code === \"EEXIST\") return;\n throw e;\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === \"[object Object]\"\n );\n}\n\n/**\n * Deep merge plain objects. Arrays and primitives are overwritten, not merged.\n * @param target The target object\n * @param source The source object\n * @returns The merged object\n */\nexport function merge<T extends Record<string, unknown>>(\n target: T,\n source: Record<string, unknown>,\n): T {\n const result = { ...target } as Record<string, unknown>;\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (isPlainObject(sourceValue) && isPlainObject(targetValue)) {\n result[key] = merge(targetValue, sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n\n return result as T;\n}\n\nfunction identity<T>(x: T): T {\n return x;\n}\n\nexport function copy(\n from: string,\n to: string,\n rename: (basename: string) => string = identity,\n): void {\n if (!fs.existsSync(from)) return;\n\n const stats = fs.statSync(from);\n\n if (stats.isDirectory()) {\n fs.readdirSync(from).forEach((file) => {\n copy(path.join(from, file), path.join(to, rename(file)));\n });\n } else {\n mkdirp(path.dirname(to));\n fs.copyFileSync(from, to);\n }\n}\n","import type { BuildTools } from \"./index\";\n\nconst unpluginFragnoVersion = \"^0.0.1\";\n\nexport const buildToolPkg: Record<BuildTools, Record<string, unknown>> = {\n none: {},\n tsdown: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n tsdown: \"^0.11.9\",\n },\n scripts: {\n build: \"tsdown\",\n },\n },\n esbuild: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n esbuild: \"^0.25.10\",\n },\n scripts: {\n build: \"./esbuild.config.js\",\n },\n },\n vite: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n vite: \"^6.0.0\",\n },\n scripts: {\n build: \"vite build\",\n },\n },\n rollup: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n \"@rollup/plugin-node-resolve\": \"^16.0.2\",\n \"@rollup/plugin-typescript\": \"^12.1.4\",\n tslib: \"^2.8.1\",\n rollup: \"^4.52.4\",\n },\n scripts: {\n build: \"rollup -c\",\n },\n },\n webpack: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n webpack: \"^5.102.0\",\n \"webpack-cli\": \"^6.0.1\",\n \"ts-loader\": \"^9.5.1\",\n },\n scripts: {\n build: \"webpack\",\n },\n },\n rspack: {\n devDependencies: {\n \"@fragno-dev/unplugin-fragno\": unpluginFragnoVersion,\n \"@rspack/core\": \"^1.5.8\",\n \"@rspack/cli\": \"^1.5.8\",\n },\n scripts: {\n build: \"rspack build\",\n },\n },\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { copy, merge } from \"./utils.ts\";\nimport { buildToolPkg } from \"./package-json.ts\";\nimport { z } from \"zod\";\n\nconst templateTypesSchema = z.literal(\"fragment\");\nexport type TemplateTypes = z.infer<typeof templateTypesSchema>;\n\nconst buildToolsSchema = z.enum([\n \"esbuild\",\n \"tsdown\",\n \"vite\",\n \"rollup\",\n \"webpack\",\n \"rspack\",\n \"none\",\n]);\nexport type BuildTools = z.infer<typeof buildToolsSchema>;\n\nconst agentDocsSchema = z.enum([\"AGENTS.md\", \"CLAUDE.md\", \"none\"]);\nexport type AgentDocs = z.infer<typeof agentDocsSchema>;\n\nexport const createOptionsSchema = z.object({\n path: z.string(),\n buildTool: buildToolsSchema,\n name: z.string(),\n template: templateTypesSchema,\n agentDocs: agentDocsSchema,\n});\n\ntype CreateOptions = z.infer<typeof createOptionsSchema>;\n\nexport function create(options: CreateOptions) {\n let pkgOverride: Record<string, unknown> = { name: options.name };\n\n // Build tool pkg overrides\n pkgOverride = merge(pkgOverride, buildToolPkg[options.buildTool]);\n\n if (options.template == \"fragment\") {\n writeFragmentTemplate(options.path, pkgOverride);\n } else {\n throw new Error(`Unsupported template type: ${options.template}`);\n }\n\n switch (options.buildTool) {\n case \"esbuild\":\n writeOptionalTemplate(options.path, \"builder/esbuild.config.js\");\n break;\n case \"tsdown\":\n writeOptionalTemplate(options.path, \"builder/tsdown.config.ts\");\n break;\n case \"vite\":\n writeOptionalTemplate(options.path, \"builder/vite.config.ts\");\n break;\n case \"rollup\":\n writeOptionalTemplate(options.path, \"builder/rollup.config.js\");\n break;\n case \"webpack\":\n writeOptionalTemplate(options.path, \"builder/webpack.config.js\");\n break;\n case \"rspack\":\n writeOptionalTemplate(options.path, \"builder/rspack.config.js\");\n break;\n case \"none\":\n break;\n }\n\n switch (options.agentDocs) {\n case \"AGENTS.md\":\n writeOptionalTemplate(options.path, \"agent/AGENTS.md\");\n break;\n case \"CLAUDE.md\":\n writeOptionalTemplate(options.path, \"agent/AGENTS.md\", \"CLAUDE.md\");\n break;\n case \"none\":\n break;\n }\n}\n\nfunction getTemplateDir(): string {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n return path.join(__dirname, \"..\", \"templates\");\n}\n\nfunction writeOptionalTemplate(targetPath: string, template: string, rename?: string) {\n const templatePath = path.join(getTemplateDir(), \"optional\", template);\n const targetFileName = rename ? rename : path.basename(template);\n const targetFile = path.join(targetPath, targetFileName);\n\n copy(templatePath, targetFile);\n}\n\nfunction writeFragmentTemplate(targetPath: string, pkgOverrides: Record<string, unknown>) {\n const templateDir = path.join(getTemplateDir(), \"fragment\");\n\n // Copy template files\n copy(templateDir, targetPath, (basename) => {\n if (basename === \"package.template.json\") {\n return \"package.json\";\n }\n return basename;\n });\n\n // Update package.json based on chosen options\n const packageJsonPath = path.join(targetPath, \"package.json\");\n const basePkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const newPkg = merge(basePkg, pkgOverrides);\n\n // Write to disk\n fs.writeFileSync(packageJsonPath, JSON.stringify(newPkg, null, 2) + \"\\n\");\n}\n"],"mappings":"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"}
|