@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.
@@ -1,12 +1,12 @@
1
1
  $ tsdown
2
- ℹ tsdown v0.15.6 powered by rolldown v1.0.0-beta.41
2
+ ℹ tsdown v0.15.9 powered by rolldown v1.0.0-beta.44
3
3
  ℹ Using tsdown config: /home/runner/work/fragno/fragno/packages/create/tsdown.config.ts
4
4
  ℹ entry: src/index.ts
5
5
  ℹ tsconfig: tsconfig.json
6
6
  ℹ Build start
7
- ℹ dist/index.js 4.48 kB │ gzip: 1.51 kB
8
- ℹ dist/index.js.map 8.87 kB │ gzip: 2.80 kB
9
- ℹ dist/index.d.ts.map 0.35 kB │ gzip: 0.22 kB
10
- ℹ dist/index.d.ts 0.40 kB │ gzip: 0.25 kB
11
- ℹ 4 files, total: 14.10 kB
12
- ✔ Build complete in 13800ms
7
+ ℹ dist/index.js  5.15 kB │ gzip: 1.70 kB
8
+ ℹ dist/index.js.map 10.09 kB │ gzip: 3.07 kB
9
+ ℹ dist/index.d.ts.map  0.58 kB │ gzip: 0.31 kB
10
+ ℹ dist/index.d.ts  1.25 kB │ gzip: 0.46 kB
11
+ ℹ 4 files, total: 17.08 kB
12
+ ✔ Build complete in 2604ms
@@ -3,64 +3,64 @@ $ vitest run
3
3
   RUN  v3.2.4 /home/runner/work/fragno/fragno/packages/create
4
4
  Coverage enabled with istanbul
5
5
 
6
- ✓ src/utils.test.ts (1 test) 24ms
6
+ ✓ src/utils.test.ts (1 test) 4ms
7
7
  stdout | src/integration.test.ts > fragment with rspack
8
- temp /tmp/fragment-test-tsdown-1759910775013
8
+ temp /tmp/fragment-test-tsdown-1760972394592
9
9
 
10
10
  stdout | src/integration.test.ts > fragment with tsdown > package.json correctly templated
11
- temp /tmp/fragment-test-esbuild-1759910775014
11
+ temp /tmp/fragment-test-esbuild-1760972394596
12
12
 
13
13
  stdout | src/integration.test.ts > fragment with esbuild > package.json correctly templated
14
- temp /tmp/fragment-test-vite-1759910775018
14
+ temp /tmp/fragment-test-vite-1760972394596
15
15
 
16
16
  stdout | src/integration.test.ts > fragment with vite > package.json correctly templated
17
- temp /tmp/fragment-test-rollup-1759910775018
17
+ temp /tmp/fragment-test-rollup-1760972394596
18
18
 
19
19
  stdout | src/integration.test.ts > fragment with rollup > package.json correctly templated
20
- temp /tmp/fragment-test-webpack-1759910775018
20
+ temp /tmp/fragment-test-webpack-1760972394597
21
21
 
22
22
  stdout | src/integration.test.ts > fragment with webpack > package.json correctly templated
23
- temp /tmp/fragment-test-rspack-1759910775018
23
+ temp /tmp/fragment-test-rspack-1760972394597
24
24
 
25
- stdout | src/integration.test.ts > fragment with vite > compiles
25
+ stdout | src/integration.test.ts > fragment with webpack > compiles
26
26
  
27
27
 
28
28
  stdout | src/integration.test.ts > fragment with rspack > compiles
29
29
  
30
30
 
31
- stdout | src/integration.test.ts > fragment with tsdown > builds
31
+ stdout | src/integration.test.ts > fragment with rollup
32
32
  
33
33
 
34
- stdout | src/integration.test.ts > fragment with esbuild > builds
34
+ stdout | src/integration.test.ts
35
35
  
36
36
 
37
37
  stdout | src/integration.test.ts
38
38
  
39
39
 
40
- stdout | src/integration.test.ts > fragment with vite > builds
40
+ stdout | src/integration.test.ts > fragment with webpack > builds
41
41
  
42
42
 
43
- ✓ src/integration.test.ts (24 tests | 1 skipped) 48944ms
44
- ✓ fragment with tsdown > installs  5270ms
45
- ✓ fragment with tsdown > compiles  12751ms
46
- ✓ fragment with tsdown > builds  22526ms
47
- ✓ fragment with esbuild > installs  4957ms
48
- ✓ fragment with esbuild > compiles  13190ms
49
- ✓ fragment with esbuild > builds  5102ms
50
- ✓ fragment with vite > installs  5743ms
51
- ✓ fragment with vite > compiles  14099ms
52
- ✓ fragment with vite > builds  11778ms
53
- ✓ fragment with rollup > installs  5212ms
54
- ✓ fragment with rollup > compiles  13215ms
55
- ✓ fragment with webpack > installs  5278ms
56
- ✓ fragment with webpack > compiles  12925ms
57
- ✓ fragment with webpack > builds  29912ms
58
- ✓ fragment with rspack > installs  5536ms
59
- ✓ fragment with rspack > compiles  12422ms
60
- ✓ fragment with rspack > builds  8061ms
43
+ ✓ src/integration.test.ts (30 tests | 1 skipped) 24967ms
44
+ ✓ fragment with tsdown > installs  2596ms
45
+ ✓ fragment with tsdown > compiles  7152ms
46
+ ✓ fragment with tsdown > builds  9413ms
47
+ ✓ fragment with esbuild > installs  2515ms
48
+ ✓ fragment with esbuild > compiles  6488ms
49
+ ✓ fragment with esbuild > builds  1739ms
50
+ ✓ fragment with vite > installs  2517ms
51
+ ✓ fragment with vite > compiles  6562ms
52
+ ✓ fragment with vite > builds  6624ms
53
+ ✓ fragment with rollup > installs  2570ms
54
+ ✓ fragment with rollup > compiles  6173ms
55
+ ✓ fragment with webpack > installs  2607ms
56
+ ✓ fragment with webpack > compiles  6274ms
57
+ ✓ fragment with webpack > builds  13005ms
58
+ ✓ fragment with rspack > installs  3026ms
59
+ ✓ fragment with rspack > compiles  5303ms
60
+ ✓ fragment with rspack > builds  3715ms
61
61
 
62
62
   Test Files  2 passed (2)
63
-  Tests  24 passed | 1 skipped (25)
64
-  Start at  08:06:10
65
-  Duration  52.54s (transform 2.20s, setup 0ms, collect 3.60s, tests 48.97s, environment 1ms, prepare 909ms)
63
+  Tests  30 passed | 1 skipped (31)
64
+  Start at  14:59:53
65
+  Duration  25.62s (transform 325ms, setup 0ms, collect 498ms, tests 24.97s, environment 0ms, prepare 179ms)
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
- type TemplateTypes = "fragment";
3
- type BuildTools = "esbuild" | "tsdown" | "vite" | "rollup" | "webpack" | "rspack" | "none";
4
- interface CreateOptions {
5
- path: string;
6
- buildTool: BuildTools;
7
- name: string;
8
- template: TemplateTypes;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";KAMK,aAAA;AAAA,KAEO,UAAA,GAFM,SAAA,GAAA,QAAA,GAAA,MAAA,GAAA,QAAA,GAAA,SAAA,GAAA,QAAA,GAAA,MAAA;AAElB,UAEU,aAAA,CAFY;EAEZ,IAAA,EAAA,MAAA;EAAa,SAAA,EAEV,UAFU;MAEV,EAAA,MAAA;UAED,EAAA,aAAA;;AAGI,iBAAA,MAAA,CAAgB,OAAa,EAAb,aAAa,CAAA,EAAA,IAAA"}
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 targetFile = path.join(targetPath, path.basename(template));
138
- copy(templatePath, targetFile);
169
+ const targetFileName = rename ? rename : path.basename(template);
170
+ copy(templatePath, path.join(targetPath, targetFileName));
139
171
  }
140
172
  function writeFragmentTemplate(targetPath, pkgOverrides) {
141
- const templateDir = path.join(getTemplateDir(), "fragment");
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 basePkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
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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"}