@tanstack/cta-engine 0.10.0-alpha.15 → 0.10.0-alpha.17
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/dist/cli.js +24 -25
- package/dist/create-app.js +9 -9
- package/dist/custom-add-on.js +7 -9
- package/dist/index.js +0 -4
- package/dist/options.js +14 -12
- package/dist/types/cli.d.ts +2 -1
- package/dist/types/custom-add-on.d.ts +1 -4
- package/dist/types/index.d.ts +0 -6
- package/dist/types/options.d.ts +3 -3
- package/dist/types/types.d.ts +5 -5
- package/package.json +1 -1
- package/src/cli.ts +32 -32
- package/src/create-app.ts +9 -9
- package/src/custom-add-on.ts +8 -10
- package/src/index.ts +0 -10
- package/src/options.ts +24 -13
- package/src/types.ts +5 -5
- package/templates/react/add-on/t3env/README.md +16 -0
- package/templates/react/add-on/t3env/assets/src/env.ts +39 -0
- package/templates/react/add-on/t3env/info.json +10 -0
- package/templates/react/add-on/t3env/package.json +6 -0
- package/templates/react/base/package.json +1 -0
- package/templates/solid/add-on/t3env/README.md +16 -0
- package/templates/solid/add-on/t3env/assets/src/env.ts +39 -0
- package/templates/solid/add-on/t3env/info.json +10 -0
- package/templates/solid/add-on/t3env/package.json +6 -0
- package/templates/solid/base/package.json +1 -0
- package/tests/snapshots/cra/cr-js-npm.json +1 -1
- package/tests/snapshots/cra/cr-ts-npm.json +1 -1
- package/tests/snapshots/cra/cr-ts-start-npm.json +1 -1
- package/tests/snapshots/cra/fr-ts-npm.json +1 -1
- package/tests/snapshots/cra/fr-ts-tw-npm.json +1 -1
- package/tests/snapshots/cra/solid-cr-js-npm.json +1 -1
- package/tests/snapshots/cra/solid-cr-ts-npm.json +1 -1
- package/tests/snapshots/cra/solid-cr-ts-start-npm.json +1 -1
- package/tests/snapshots/cra/solid-fr-ts-npm.json +1 -1
- package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -7,30 +7,29 @@ import { SUPPORTED_TOOLCHAINS } from './toolchain.js';
|
|
|
7
7
|
import runServer from './mcp.js';
|
|
8
8
|
import { listAddOns } from './add-ons.js';
|
|
9
9
|
import { DEFAULT_FRAMEWORK, SUPPORTED_FRAMEWORKS } from './constants.js';
|
|
10
|
-
import { initAddOn } from './custom-add-on.js'
|
|
10
|
+
// import { initAddOn } from './custom-add-on.js'
|
|
11
11
|
import { createDefaultEnvironment } from './environment.js';
|
|
12
|
-
import { add } from './add.js';
|
|
13
12
|
export function cli({ name, appName, forcedMode, forcedAddOns, }) {
|
|
14
13
|
const program = new Command();
|
|
15
14
|
program.name(name).description(`CLI to create a new ${appName} application`);
|
|
16
|
-
program
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
program
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
})
|
|
28
|
-
program
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
15
|
+
// program
|
|
16
|
+
// .command('add')
|
|
17
|
+
// .argument('add-on', 'Name of the add-on (or add-ons separated by commas)')
|
|
18
|
+
// .action(async (addOn: string) => {
|
|
19
|
+
// await add(addOn.split(',').map((addon) => addon.trim()))
|
|
20
|
+
// })
|
|
21
|
+
// program
|
|
22
|
+
// .command('update-add-on')
|
|
23
|
+
// .description('Create or update an add-on from the current project')
|
|
24
|
+
// .action(async () => {
|
|
25
|
+
// await initAddOn('add-on')
|
|
26
|
+
// })
|
|
27
|
+
// program
|
|
28
|
+
// .command('update-overlay')
|
|
29
|
+
// .description('Create or update a project overlay from the current project')
|
|
30
|
+
// .action(async () => {
|
|
31
|
+
// await initAddOn('overlay')
|
|
32
|
+
// })
|
|
34
33
|
program.argument('[project-name]', 'name of the project');
|
|
35
34
|
if (!forcedMode) {
|
|
36
35
|
program.option('--template <type>', 'project template (typescript, javascript, file-router)', (value) => {
|
|
@@ -49,7 +48,7 @@ export function cli({ name, appName, forcedMode, forcedAddOns, }) {
|
|
|
49
48
|
}
|
|
50
49
|
return value;
|
|
51
50
|
}, DEFAULT_FRAMEWORK)
|
|
52
|
-
.option('--
|
|
51
|
+
// .option('--overlay [url]', 'add an overlay from a URL', false)
|
|
53
52
|
.option(`--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`, `Explicitly tell the CLI to use this package manager`, (value) => {
|
|
54
53
|
if (!SUPPORTED_PACKAGE_MANAGERS.includes(value)) {
|
|
55
54
|
throw new InvalidArgumentError(`Invalid package manager: ${value}. The following are allowed: ${SUPPORTED_PACKAGE_MANAGERS.join(', ')}`);
|
|
@@ -78,13 +77,13 @@ export function cli({ name, appName, forcedMode, forcedAddOns, }) {
|
|
|
78
77
|
program.action(async (projectName, options) => {
|
|
79
78
|
if (options.listAddOns) {
|
|
80
79
|
await listAddOns(options, {
|
|
81
|
-
forcedMode,
|
|
80
|
+
forcedMode: forcedMode,
|
|
82
81
|
forcedAddOns,
|
|
83
82
|
});
|
|
84
83
|
}
|
|
85
84
|
else if (options.mcp || options.mcpSse) {
|
|
86
85
|
await runServer(!!options.mcpSse, {
|
|
87
|
-
forcedMode,
|
|
86
|
+
forcedMode: forcedMode,
|
|
88
87
|
forcedAddOns,
|
|
89
88
|
appName,
|
|
90
89
|
});
|
|
@@ -98,14 +97,14 @@ export function cli({ name, appName, forcedMode, forcedAddOns, }) {
|
|
|
98
97
|
if (forcedMode) {
|
|
99
98
|
cliOptions.template = forcedMode;
|
|
100
99
|
}
|
|
101
|
-
let finalOptions = await normalizeOptions(cliOptions, forcedAddOns);
|
|
100
|
+
let finalOptions = await normalizeOptions(cliOptions, forcedMode, forcedAddOns);
|
|
102
101
|
if (finalOptions) {
|
|
103
102
|
intro(`Creating a new ${appName} app in ${projectName}...`);
|
|
104
103
|
}
|
|
105
104
|
else {
|
|
106
105
|
intro(`Let's configure your ${appName} application`);
|
|
107
106
|
finalOptions = await promptForOptions(cliOptions, {
|
|
108
|
-
forcedMode,
|
|
107
|
+
forcedMode: forcedMode,
|
|
109
108
|
forcedAddOns,
|
|
110
109
|
});
|
|
111
110
|
}
|
package/dist/create-app.js
CHANGED
|
@@ -332,9 +332,9 @@ export async function createApp(options, { silent = false, environment, cwd, app
|
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
|
-
if (options.
|
|
336
|
-
if (options.
|
|
337
|
-
for (const component of options.
|
|
335
|
+
if (options.overlay) {
|
|
336
|
+
if (options.overlay.shadcnComponents) {
|
|
337
|
+
for (const component of options.overlay.shadcnComponents) {
|
|
338
338
|
shadcnComponents.add(component);
|
|
339
339
|
}
|
|
340
340
|
}
|
|
@@ -433,11 +433,11 @@ export async function createApp(options, { silent = false, environment, cwd, app
|
|
|
433
433
|
}
|
|
434
434
|
// Create the README.md
|
|
435
435
|
await templateFile(templateDirBase, 'README.md.ejs');
|
|
436
|
-
// Adding
|
|
437
|
-
if (options.
|
|
438
|
-
s?.start(`Setting up
|
|
439
|
-
await runAddOn(options.
|
|
440
|
-
s?.stop(`
|
|
436
|
+
// Adding overlay
|
|
437
|
+
if (options.overlay) {
|
|
438
|
+
s?.start(`Setting up overlay ${options.overlay.name}...`);
|
|
439
|
+
await runAddOn(options.overlay);
|
|
440
|
+
s?.stop(`Overlay ${options.overlay.name} setup complete`);
|
|
441
441
|
}
|
|
442
442
|
// Install dependencies
|
|
443
443
|
s?.start(`Installing dependencies via ${options.packageManager}...`);
|
|
@@ -492,6 +492,6 @@ Use the following commands to start your app:
|
|
|
492
492
|
% cd ${options.projectName}
|
|
493
493
|
% ${startCommand}
|
|
494
494
|
|
|
495
|
-
Please
|
|
495
|
+
Please read the README.md for more information on testing, styling, adding routes, react-query, etc.${errorStatement}`);
|
|
496
496
|
}
|
|
497
497
|
}
|
package/dist/custom-add-on.js
CHANGED
|
@@ -9,11 +9,11 @@ import { finalizeAddOns } from './add-ons.js';
|
|
|
9
9
|
import { readFileHelper } from './file-helper.js';
|
|
10
10
|
const INFO_FILE = {
|
|
11
11
|
'add-on': '.add-on/info.json',
|
|
12
|
-
|
|
12
|
+
overlay: 'overlay-info.json',
|
|
13
13
|
};
|
|
14
14
|
const COMPILED_FILE = {
|
|
15
15
|
'add-on': 'add-on.json',
|
|
16
|
-
|
|
16
|
+
overlay: 'overlay.json',
|
|
17
17
|
};
|
|
18
18
|
const ADD_ON_DIR = '.add-on';
|
|
19
19
|
const ASSETS_DIR = 'assets';
|
|
@@ -76,7 +76,7 @@ export default (parentRoute: RootRoute) => createRoute({
|
|
|
76
76
|
.trim();
|
|
77
77
|
return { url: path, code, name };
|
|
78
78
|
}
|
|
79
|
-
|
|
79
|
+
async function createOptions(json) {
|
|
80
80
|
return {
|
|
81
81
|
...json,
|
|
82
82
|
chosenAddOns: await finalizeAddOns(json.framework, json.mode, [...json.existingAddOns]),
|
|
@@ -154,13 +154,12 @@ To create an add-on, the project must be created with TypeScript.`);
|
|
|
154
154
|
: {
|
|
155
155
|
name: `${persistedOptions.projectName}-${mode}`,
|
|
156
156
|
version: '0.0.1',
|
|
157
|
-
description: mode === 'add-on' ? 'Add-on' : 'Project
|
|
157
|
+
description: mode === 'add-on' ? 'Add-on' : 'Project overlay',
|
|
158
158
|
author: 'Jane Smith <jane.smith@example.com>',
|
|
159
159
|
license: 'MIT',
|
|
160
160
|
link: `https://github.com/jane-smith/${persistedOptions.projectName}-${mode}`,
|
|
161
161
|
command: {},
|
|
162
162
|
shadcnComponents: [],
|
|
163
|
-
framework: persistedOptions.framework,
|
|
164
163
|
templates: [persistedOptions.mode],
|
|
165
164
|
routes: [],
|
|
166
165
|
warning: '',
|
|
@@ -174,7 +173,7 @@ To create an add-on, the project must be created with TypeScript.`);
|
|
|
174
173
|
},
|
|
175
174
|
};
|
|
176
175
|
const compiledInfo = JSON.parse(JSON.stringify(info));
|
|
177
|
-
const originalOutput = await runCreateApp(await
|
|
176
|
+
const originalOutput = await runCreateApp(await createOptions(persistedOptions));
|
|
178
177
|
const originalPackageJson = JSON.parse(originalOutput.files[resolve(process.cwd(), 'package.json')]);
|
|
179
178
|
const currentPackageJson = JSON.parse((await readFile('package.json')).toString());
|
|
180
179
|
for (const script of Object.keys(currentPackageJson.scripts)) {
|
|
@@ -202,7 +201,7 @@ To create an add-on, the project must be created with TypeScript.`);
|
|
|
202
201
|
// Find altered files
|
|
203
202
|
const changedFiles = {};
|
|
204
203
|
await compareFiles('.', IGNORE_FILES, originalOutput.files, changedFiles);
|
|
205
|
-
if (mode === '
|
|
204
|
+
if (mode === 'overlay') {
|
|
206
205
|
compiledInfo.files = changedFiles;
|
|
207
206
|
}
|
|
208
207
|
else {
|
|
@@ -236,8 +235,7 @@ To create an add-on, the project must be created with TypeScript.`);
|
|
|
236
235
|
compiledInfo.routes = info.routes;
|
|
237
236
|
compiledInfo.framework = persistedOptions.framework;
|
|
238
237
|
compiledInfo.addDependencies = persistedOptions.existingAddOns;
|
|
239
|
-
|
|
240
|
-
if (mode === 'starter') {
|
|
238
|
+
if (mode === 'overlay') {
|
|
241
239
|
compiledInfo.mode = persistedOptions.mode;
|
|
242
240
|
compiledInfo.typescript = persistedOptions.typescript;
|
|
243
241
|
compiledInfo.tailwind = persistedOptions.tailwind;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
1
|
export { cli } from './cli.js';
|
|
2
|
-
export { getAllAddOns } from './add-ons.js';
|
|
3
|
-
export { createApp } from './create-app.js';
|
|
4
|
-
export { createAppOptionsFromPersisted } from './custom-add-on.js';
|
|
5
|
-
export { createMemoryEnvironment, createDefaultEnvironment, } from './environment.js';
|
package/dist/options.js
CHANGED
|
@@ -4,7 +4,7 @@ import { DEFAULT_TOOLCHAIN, SUPPORTED_TOOLCHAINS } from './toolchain.js';
|
|
|
4
4
|
import { CODE_ROUTER, DEFAULT_FRAMEWORK, FILE_ROUTER } from './constants.js';
|
|
5
5
|
import { finalizeAddOns, getAllAddOns, loadRemoteAddOn } from './add-ons.js';
|
|
6
6
|
// If all CLI options are provided, use them directly
|
|
7
|
-
export async function normalizeOptions(cliOptions, forcedAddOns) {
|
|
7
|
+
export async function normalizeOptions(cliOptions, forcedMode, forcedAddOns) {
|
|
8
8
|
// in some cases, if you use windows/powershell, the argument for addons
|
|
9
9
|
// if sepparated by comma is not really passed as an array, but as a string
|
|
10
10
|
// with spaces, We need to normalize this edge case.
|
|
@@ -23,22 +23,22 @@ export async function normalizeOptions(cliOptions, forcedAddOns) {
|
|
|
23
23
|
tailwind = true;
|
|
24
24
|
}
|
|
25
25
|
let mode = cliOptions.template === 'file-router' ? FILE_ROUTER : CODE_ROUTER;
|
|
26
|
-
const
|
|
27
|
-
? (await loadRemoteAddOn(cliOptions.
|
|
26
|
+
const overlay = cliOptions.overlay
|
|
27
|
+
? (await loadRemoteAddOn(cliOptions.overlay))
|
|
28
28
|
: undefined;
|
|
29
|
-
if (
|
|
30
|
-
tailwind =
|
|
31
|
-
typescript =
|
|
32
|
-
cliOptions.framework =
|
|
33
|
-
mode =
|
|
29
|
+
if (overlay) {
|
|
30
|
+
tailwind = overlay.tailwind;
|
|
31
|
+
typescript = overlay.typescript;
|
|
32
|
+
cliOptions.framework = overlay.framework;
|
|
33
|
+
mode = overlay.mode;
|
|
34
34
|
}
|
|
35
35
|
let addOns = false;
|
|
36
36
|
let chosenAddOns = [];
|
|
37
37
|
if (Array.isArray(cliOptions.addOns) ||
|
|
38
|
-
|
|
38
|
+
overlay?.dependsOn ||
|
|
39
39
|
forcedAddOns) {
|
|
40
40
|
addOns = true;
|
|
41
|
-
let finalAddOns = Array.from(new Set([...(
|
|
41
|
+
let finalAddOns = Array.from(new Set([...(overlay?.dependsOn || []), ...(forcedAddOns || [])]));
|
|
42
42
|
if (cliOptions.addOns && Array.isArray(cliOptions.addOns)) {
|
|
43
43
|
finalAddOns = Array.from(new Set([
|
|
44
44
|
...(forcedAddOns || []),
|
|
@@ -46,7 +46,9 @@ export async function normalizeOptions(cliOptions, forcedAddOns) {
|
|
|
46
46
|
...cliOptions.addOns,
|
|
47
47
|
]));
|
|
48
48
|
}
|
|
49
|
-
chosenAddOns = await finalizeAddOns(cliOptions.framework || DEFAULT_FRAMEWORK, cliOptions.template === 'file-router'
|
|
49
|
+
chosenAddOns = await finalizeAddOns(cliOptions.framework || DEFAULT_FRAMEWORK, forcedMode || cliOptions.template === 'file-router'
|
|
50
|
+
? FILE_ROUTER
|
|
51
|
+
: CODE_ROUTER, finalAddOns);
|
|
50
52
|
tailwind = true;
|
|
51
53
|
typescript = true;
|
|
52
54
|
}
|
|
@@ -64,7 +66,7 @@ export async function normalizeOptions(cliOptions, forcedAddOns) {
|
|
|
64
66
|
addOns,
|
|
65
67
|
chosenAddOns,
|
|
66
68
|
variableValues: {},
|
|
67
|
-
|
|
69
|
+
overlay,
|
|
68
70
|
};
|
|
69
71
|
}
|
|
70
72
|
}
|
package/dist/types/cli.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Mode } from './types.js';
|
|
1
2
|
export declare function cli({ name, appName, forcedMode, forcedAddOns, }: {
|
|
2
3
|
name: string;
|
|
3
4
|
appName: string;
|
|
4
|
-
forcedMode?:
|
|
5
|
+
forcedMode?: Mode;
|
|
5
6
|
forcedAddOns?: Array<string>;
|
|
6
7
|
}): void;
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
import type { PersistedOptions } from './config-file.js';
|
|
3
|
-
type AddOnMode = 'add-on' | 'starter';
|
|
4
|
-
export declare function createAppOptionsFromPersisted(json: PersistedOptions): Promise<Required<Options>>;
|
|
1
|
+
type AddOnMode = 'add-on' | 'overlay';
|
|
5
2
|
export declare function initAddOn(mode: AddOnMode): Promise<void>;
|
|
6
3
|
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
1
|
export { cli } from './cli.js';
|
|
2
|
-
export { getAllAddOns } from './add-ons.js';
|
|
3
|
-
export { createApp } from './create-app.js';
|
|
4
|
-
export { createAppOptionsFromPersisted } from './custom-add-on.js';
|
|
5
|
-
export { createMemoryEnvironment, createDefaultEnvironment, } from './environment.js';
|
|
6
|
-
export type { AddOn, Framework, Mode } from './types.js';
|
|
7
|
-
export type { PersistedOptions } from './config-file.js';
|
package/dist/types/options.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { CliOptions, Options } from './types.js';
|
|
2
|
-
export declare function normalizeOptions(cliOptions: CliOptions, forcedAddOns?: Array<string>): Promise<Options | undefined>;
|
|
1
|
+
import type { CliOptions, Mode, Options, TemplateOptions } from './types.js';
|
|
2
|
+
export declare function normalizeOptions(cliOptions: CliOptions, forcedMode?: Mode, forcedAddOns?: Array<string>): Promise<Options | undefined>;
|
|
3
3
|
export declare function promptForOptions(cliOptions: CliOptions, { forcedAddOns, forcedMode, }: {
|
|
4
4
|
forcedAddOns?: Array<string>;
|
|
5
|
-
forcedMode?:
|
|
5
|
+
forcedMode?: TemplateOptions;
|
|
6
6
|
}): Promise<Required<Options>>;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export interface Options {
|
|
|
16
16
|
chosenAddOns: Array<AddOn>;
|
|
17
17
|
git: boolean;
|
|
18
18
|
variableValues: Record<string, string | number | boolean>;
|
|
19
|
-
|
|
19
|
+
overlay?: AddOn | undefined;
|
|
20
20
|
}
|
|
21
21
|
export interface CliOptions {
|
|
22
22
|
template?: TemplateOptions;
|
|
@@ -30,7 +30,7 @@ export interface CliOptions {
|
|
|
30
30
|
listAddOns?: boolean;
|
|
31
31
|
mcp?: boolean;
|
|
32
32
|
mcpSse?: boolean;
|
|
33
|
-
|
|
33
|
+
overlay?: string;
|
|
34
34
|
targetDir?: string;
|
|
35
35
|
}
|
|
36
36
|
export type Environment = {
|
|
@@ -70,7 +70,7 @@ export type AddOn = {
|
|
|
70
70
|
id: string;
|
|
71
71
|
name: string;
|
|
72
72
|
description: string;
|
|
73
|
-
type: 'add-on' | 'example' | '
|
|
73
|
+
type: 'add-on' | 'example' | 'overlay';
|
|
74
74
|
link: string;
|
|
75
75
|
templates: Array<string>;
|
|
76
76
|
routes: Array<{
|
|
@@ -95,8 +95,8 @@ export type AddOn = {
|
|
|
95
95
|
files?: Record<string, string>;
|
|
96
96
|
deletedFiles?: Array<string>;
|
|
97
97
|
};
|
|
98
|
-
export type
|
|
99
|
-
type: '
|
|
98
|
+
export type Overlay = AddOn & {
|
|
99
|
+
type: 'overlay';
|
|
100
100
|
version: string;
|
|
101
101
|
author: string;
|
|
102
102
|
link: string;
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -9,14 +9,14 @@ import { SUPPORTED_TOOLCHAINS } from './toolchain.js'
|
|
|
9
9
|
import runServer from './mcp.js'
|
|
10
10
|
import { listAddOns } from './add-ons.js'
|
|
11
11
|
import { DEFAULT_FRAMEWORK, SUPPORTED_FRAMEWORKS } from './constants.js'
|
|
12
|
-
import { initAddOn } from './custom-add-on.js'
|
|
12
|
+
// import { initAddOn } from './custom-add-on.js'
|
|
13
13
|
|
|
14
14
|
import { createDefaultEnvironment } from './environment.js'
|
|
15
|
-
import { add } from './add.js'
|
|
15
|
+
// import { add } from './add.js'
|
|
16
16
|
|
|
17
17
|
import type { PackageManager } from './package-manager.js'
|
|
18
18
|
import type { ToolChain } from './toolchain.js'
|
|
19
|
-
import type { CliOptions, Framework } from './types.js'
|
|
19
|
+
import type { CliOptions, Framework, Mode, TemplateOptions } from './types.js'
|
|
20
20
|
|
|
21
21
|
export function cli({
|
|
22
22
|
name,
|
|
@@ -26,33 +26,33 @@ export function cli({
|
|
|
26
26
|
}: {
|
|
27
27
|
name: string
|
|
28
28
|
appName: string
|
|
29
|
-
forcedMode?:
|
|
29
|
+
forcedMode?: Mode
|
|
30
30
|
forcedAddOns?: Array<string>
|
|
31
31
|
}) {
|
|
32
32
|
const program = new Command()
|
|
33
33
|
|
|
34
34
|
program.name(name).description(`CLI to create a new ${appName} application`)
|
|
35
35
|
|
|
36
|
-
program
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
// program
|
|
37
|
+
// .command('add')
|
|
38
|
+
// .argument('add-on', 'Name of the add-on (or add-ons separated by commas)')
|
|
39
|
+
// .action(async (addOn: string) => {
|
|
40
|
+
// await add(addOn.split(',').map((addon) => addon.trim()))
|
|
41
|
+
// })
|
|
42
42
|
|
|
43
|
-
program
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
// program
|
|
44
|
+
// .command('update-add-on')
|
|
45
|
+
// .description('Create or update an add-on from the current project')
|
|
46
|
+
// .action(async () => {
|
|
47
|
+
// await initAddOn('add-on')
|
|
48
|
+
// })
|
|
49
49
|
|
|
50
|
-
program
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
// program
|
|
51
|
+
// .command('update-overlay')
|
|
52
|
+
// .description('Create or update a project overlay from the current project')
|
|
53
|
+
// .action(async () => {
|
|
54
|
+
// await initAddOn('overlay')
|
|
55
|
+
// })
|
|
56
56
|
|
|
57
57
|
program.argument('[project-name]', 'name of the project')
|
|
58
58
|
|
|
@@ -90,11 +90,7 @@ export function cli({
|
|
|
90
90
|
},
|
|
91
91
|
DEFAULT_FRAMEWORK,
|
|
92
92
|
)
|
|
93
|
-
.option(
|
|
94
|
-
'--starter [url]',
|
|
95
|
-
'initialize this project from a starter URL',
|
|
96
|
-
false,
|
|
97
|
-
)
|
|
93
|
+
// .option('--overlay [url]', 'add an overlay from a URL', false)
|
|
98
94
|
.option<PackageManager>(
|
|
99
95
|
`--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`,
|
|
100
96
|
`Explicitly tell the CLI to use this package manager`,
|
|
@@ -147,12 +143,12 @@ export function cli({
|
|
|
147
143
|
program.action(async (projectName: string, options: CliOptions) => {
|
|
148
144
|
if (options.listAddOns) {
|
|
149
145
|
await listAddOns(options, {
|
|
150
|
-
forcedMode,
|
|
146
|
+
forcedMode: forcedMode as TemplateOptions,
|
|
151
147
|
forcedAddOns,
|
|
152
148
|
})
|
|
153
149
|
} else if (options.mcp || options.mcpSse) {
|
|
154
150
|
await runServer(!!options.mcpSse, {
|
|
155
|
-
forcedMode,
|
|
151
|
+
forcedMode: forcedMode as TemplateOptions,
|
|
156
152
|
forcedAddOns,
|
|
157
153
|
appName,
|
|
158
154
|
})
|
|
@@ -164,16 +160,20 @@ export function cli({
|
|
|
164
160
|
} as CliOptions
|
|
165
161
|
|
|
166
162
|
if (forcedMode) {
|
|
167
|
-
cliOptions.template = forcedMode
|
|
163
|
+
cliOptions.template = forcedMode as TemplateOptions
|
|
168
164
|
}
|
|
169
165
|
|
|
170
|
-
let finalOptions = await normalizeOptions(
|
|
166
|
+
let finalOptions = await normalizeOptions(
|
|
167
|
+
cliOptions,
|
|
168
|
+
forcedMode,
|
|
169
|
+
forcedAddOns,
|
|
170
|
+
)
|
|
171
171
|
if (finalOptions) {
|
|
172
172
|
intro(`Creating a new ${appName} app in ${projectName}...`)
|
|
173
173
|
} else {
|
|
174
174
|
intro(`Let's configure your ${appName} application`)
|
|
175
175
|
finalOptions = await promptForOptions(cliOptions, {
|
|
176
|
-
forcedMode,
|
|
176
|
+
forcedMode: forcedMode as TemplateOptions,
|
|
177
177
|
forcedAddOns,
|
|
178
178
|
})
|
|
179
179
|
}
|
package/src/create-app.ts
CHANGED
|
@@ -529,9 +529,9 @@ export async function createApp(
|
|
|
529
529
|
}
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
|
-
if (options.
|
|
533
|
-
if (options.
|
|
534
|
-
for (const component of options.
|
|
532
|
+
if (options.overlay) {
|
|
533
|
+
if (options.overlay.shadcnComponents) {
|
|
534
|
+
for (const component of options.overlay.shadcnComponents) {
|
|
535
535
|
shadcnComponents.add(component)
|
|
536
536
|
}
|
|
537
537
|
}
|
|
@@ -714,11 +714,11 @@ export async function createApp(
|
|
|
714
714
|
// Create the README.md
|
|
715
715
|
await templateFile(templateDirBase, 'README.md.ejs')
|
|
716
716
|
|
|
717
|
-
// Adding
|
|
718
|
-
if (options.
|
|
719
|
-
s?.start(`Setting up
|
|
720
|
-
await runAddOn(options.
|
|
721
|
-
s?.stop(`
|
|
717
|
+
// Adding overlay
|
|
718
|
+
if (options.overlay) {
|
|
719
|
+
s?.start(`Setting up overlay ${options.overlay.name}...`)
|
|
720
|
+
await runAddOn(options.overlay)
|
|
721
|
+
s?.stop(`Overlay ${options.overlay.name} setup complete`)
|
|
722
722
|
}
|
|
723
723
|
|
|
724
724
|
// Install dependencies
|
|
@@ -799,6 +799,6 @@ Use the following commands to start your app:
|
|
|
799
799
|
% cd ${options.projectName}
|
|
800
800
|
% ${startCommand}
|
|
801
801
|
|
|
802
|
-
Please
|
|
802
|
+
Please read the README.md for more information on testing, styling, adding routes, react-query, etc.${errorStatement}`)
|
|
803
803
|
}
|
|
804
804
|
}
|
package/src/custom-add-on.ts
CHANGED
|
@@ -12,15 +12,15 @@ import { readFileHelper } from './file-helper.js'
|
|
|
12
12
|
import type { Framework, Options } from './types.js'
|
|
13
13
|
import type { PersistedOptions } from './config-file.js'
|
|
14
14
|
|
|
15
|
-
type AddOnMode = 'add-on' | '
|
|
15
|
+
type AddOnMode = 'add-on' | 'overlay'
|
|
16
16
|
|
|
17
17
|
const INFO_FILE: Record<AddOnMode, string> = {
|
|
18
18
|
'add-on': '.add-on/info.json',
|
|
19
|
-
|
|
19
|
+
overlay: 'overlay-info.json',
|
|
20
20
|
}
|
|
21
21
|
const COMPILED_FILE: Record<AddOnMode, string> = {
|
|
22
22
|
'add-on': 'add-on.json',
|
|
23
|
-
|
|
23
|
+
overlay: 'overlay.json',
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const ADD_ON_DIR = '.add-on'
|
|
@@ -102,7 +102,7 @@ export default (parentRoute: RootRoute) => createRoute({
|
|
|
102
102
|
return { url: path, code, name }
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
async function createOptions(
|
|
106
106
|
json: PersistedOptions,
|
|
107
107
|
): Promise<Required<Options>> {
|
|
108
108
|
return {
|
|
@@ -198,13 +198,12 @@ To create an add-on, the project must be created with TypeScript.`)
|
|
|
198
198
|
: {
|
|
199
199
|
name: `${persistedOptions.projectName}-${mode}`,
|
|
200
200
|
version: '0.0.1',
|
|
201
|
-
description: mode === 'add-on' ? 'Add-on' : 'Project
|
|
201
|
+
description: mode === 'add-on' ? 'Add-on' : 'Project overlay',
|
|
202
202
|
author: 'Jane Smith <jane.smith@example.com>',
|
|
203
203
|
license: 'MIT',
|
|
204
204
|
link: `https://github.com/jane-smith/${persistedOptions.projectName}-${mode}`,
|
|
205
205
|
command: {},
|
|
206
206
|
shadcnComponents: [],
|
|
207
|
-
framework: persistedOptions.framework,
|
|
208
207
|
templates: [persistedOptions.mode],
|
|
209
208
|
routes: [],
|
|
210
209
|
warning: '',
|
|
@@ -221,7 +220,7 @@ To create an add-on, the project must be created with TypeScript.`)
|
|
|
221
220
|
const compiledInfo = JSON.parse(JSON.stringify(info))
|
|
222
221
|
|
|
223
222
|
const originalOutput = await runCreateApp(
|
|
224
|
-
await
|
|
223
|
+
await createOptions(persistedOptions),
|
|
225
224
|
)
|
|
226
225
|
|
|
227
226
|
const originalPackageJson = JSON.parse(
|
|
@@ -265,7 +264,7 @@ To create an add-on, the project must be created with TypeScript.`)
|
|
|
265
264
|
// Find altered files
|
|
266
265
|
const changedFiles: Record<string, string> = {}
|
|
267
266
|
await compareFiles('.', IGNORE_FILES, originalOutput.files, changedFiles)
|
|
268
|
-
if (mode === '
|
|
267
|
+
if (mode === 'overlay') {
|
|
269
268
|
compiledInfo.files = changedFiles
|
|
270
269
|
} else {
|
|
271
270
|
const assetsDir = resolve(ADD_ON_DIR, ASSETS_DIR)
|
|
@@ -303,9 +302,8 @@ To create an add-on, the project must be created with TypeScript.`)
|
|
|
303
302
|
compiledInfo.routes = info.routes
|
|
304
303
|
compiledInfo.framework = persistedOptions.framework
|
|
305
304
|
compiledInfo.addDependencies = persistedOptions.existingAddOns
|
|
306
|
-
compiledInfo.packageAdditions = info.packageAdditions
|
|
307
305
|
|
|
308
|
-
if (mode === '
|
|
306
|
+
if (mode === 'overlay') {
|
|
309
307
|
compiledInfo.mode = persistedOptions.mode
|
|
310
308
|
compiledInfo.typescript = persistedOptions.typescript
|
|
311
309
|
compiledInfo.tailwind = persistedOptions.tailwind
|
package/src/index.ts
CHANGED
|
@@ -1,11 +1 @@
|
|
|
1
1
|
export { cli } from './cli.js'
|
|
2
|
-
export { getAllAddOns } from './add-ons.js'
|
|
3
|
-
export { createApp } from './create-app.js'
|
|
4
|
-
export { createAppOptionsFromPersisted } from './custom-add-on.js'
|
|
5
|
-
export {
|
|
6
|
-
createMemoryEnvironment,
|
|
7
|
-
createDefaultEnvironment,
|
|
8
|
-
} from './environment.js'
|
|
9
|
-
|
|
10
|
-
export type { AddOn, Framework, Mode } from './types.js'
|
|
11
|
-
export type { PersistedOptions } from './config-file.js'
|