@shopify/create-app 1.0.9 → 2.0.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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @shopify/create-app
2
2
 
3
+ ## 2.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - c6a9450b: Add support to scaffold function extensions
8
+ - Updated dependencies [c6a9450b]
9
+ - Updated dependencies [70d8d50d]
10
+ - @shopify/cli-kit@2.0.2
11
+
12
+ ## 2.0.1
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [9cb99f12]
17
+ - Updated dependencies [882e54e6]
18
+ - @shopify/cli-kit@2.0.1
19
+
20
+ ## 1.1.1
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [488c06a]
25
+ - Updated dependencies [f156c37]
26
+ - Updated dependencies [5763a76]
27
+ - @shopify/cli-kit@1.1.1
28
+
3
29
  ## 1.0.9
4
30
 
5
31
  ### Patch Changes
@@ -1,16 +1,22 @@
1
- import { ui, path, error, git, file, os, constants, string, system, dependency, output, template as template$1 } from '@shopify/cli-kit';
2
- import { fileURLToPath } from 'url';
1
+ import { ui, constants, path, dependency, file, string, git, template, npm, output, cli } from '@shopify/cli-kit';
3
2
  import { Writable } from 'stream';
4
3
  import { Flags, Command } from '@oclif/core';
5
4
 
6
5
  const init$1 = async (options, prompt = ui.prompt) => {
6
+ const templateURLMap = {
7
+ node: "https://github.com/Shopify/starter-node-app"
8
+ };
9
+ const defaults = {
10
+ name: "app",
11
+ template: templateURLMap.node
12
+ };
7
13
  const questions = [];
8
14
  if (!options.name) {
9
15
  questions.push({
10
16
  type: "input",
11
17
  name: "name",
12
18
  message: "Your app's working name?",
13
- default: "app",
19
+ default: defaults.name,
14
20
  validate: (value) => {
15
21
  if (value.length === 0) {
16
22
  return "App Name cannot be empty";
@@ -22,220 +28,160 @@ const init$1 = async (options, prompt = ui.prompt) => {
22
28
  }
23
29
  });
24
30
  }
25
- if (!options.template) {
31
+ if (!options.template && Object.keys(templateURLMap).length > 1) {
26
32
  questions.push({
27
33
  type: "select",
28
34
  name: "template",
29
- choices: ["node", "rails"],
35
+ choices: Object.keys(templateURLMap),
30
36
  message: "Which template would you like to use?",
31
- default: "https://github.com/Shopify/shopify-app-node#cli-next"
37
+ default: defaults.template
32
38
  });
33
39
  }
34
40
  const promptOutput = await prompt(questions);
35
- return { ...options, ...promptOutput, template: "https://github.com/Shopify/shopify-app-node#cli-next" };
41
+ const answers = {
42
+ ...options,
43
+ ...promptOutput
44
+ };
45
+ const templateURL = templateURLMap[answers.template];
46
+ answers.template = templateURL || answers.template || defaults.template;
47
+ return answers;
36
48
  };
37
49
 
38
- async function template(name) {
39
- const templatePath = await path.findUp(`templates/${name}`, {
40
- cwd: path.dirname(fileURLToPath(import.meta.url)),
41
- type: "directory"
42
- });
43
- if (templatePath) {
44
- return templatePath;
45
- } else {
46
- throw new error.Bug(`Couldn't find the template ${name} in @shopify/create-app.`);
50
+ async function updateCLIDependencies(packageJSON, local) {
51
+ packageJSON.dependencies = packageJSON.dependencies || {};
52
+ packageJSON.dependencies["@shopify/cli"] = constants.versions.cli;
53
+ packageJSON.dependencies["@shopify/app"] = constants.versions.app;
54
+ if (local) {
55
+ const cliPath = `file:${await path.findUp("packages/cli", { type: "directory" })}`;
56
+ const appPath = `file:${await path.findUp("packages/app", { type: "directory" })}`;
57
+ const cliKitPath = `file:${await path.findUp("packages/cli-kit", { type: "directory" })}`;
58
+ packageJSON.dependencies["@shopify/cli"] = cliPath;
59
+ packageJSON.dependencies["@shopify/app"] = appPath;
60
+ const dependencyOverrides = {
61
+ "@shopify/cli": cliPath,
62
+ "@shopify/app": appPath,
63
+ "@shopify/cli-kit": cliKitPath
64
+ };
65
+ packageJSON.overrides = packageJSON.overrides ? { ...packageJSON.overrides, ...dependencyOverrides } : dependencyOverrides;
66
+ packageJSON.resolutions = packageJSON.resolutions ? { ...packageJSON.resolutions, ...dependencyOverrides } : dependencyOverrides;
47
67
  }
68
+ return packageJSON;
48
69
  }
49
-
50
- async function downloadTemplate({ templateUrl, into }) {
51
- const components = templateUrl.split("#");
52
- let branch;
53
- const repository = components[0];
54
- if (components.length === 2) {
55
- branch = components[1];
56
- }
57
- const options = { "--recurse-submodules": null };
58
- if (branch) {
59
- options["--branch"] = branch;
60
- }
61
- await git.factory().clone(repository, into, options, (err) => {
62
- if (err) {
63
- throw new Error(err.message);
64
- }
70
+ async function getDeepInstallNPMTasks({
71
+ from,
72
+ dependencyManager,
73
+ didInstallEverything
74
+ }) {
75
+ const packageJSONFiles = await path.glob([path.join(from, "**/package.json")]);
76
+ let foldersInstalled = 0;
77
+ return packageJSONFiles.map((filePath) => {
78
+ const folderPath = filePath.replace("package.json", "");
79
+ const titlePath = folderPath.replace(from, "");
80
+ return {
81
+ title: `Installing dependencies in ${titlePath}`,
82
+ task: async (_, task) => {
83
+ const output = new Writable({
84
+ write(chunk, _2, next) {
85
+ task.output = chunk.toString();
86
+ next();
87
+ }
88
+ });
89
+ await dependency.install(folderPath, dependencyManager, output, output);
90
+ task.title = `Installed dependencies in ${titlePath}`;
91
+ foldersInstalled++;
92
+ if (foldersInstalled === packageJSONFiles.length) {
93
+ didInstallEverything();
94
+ }
95
+ }
96
+ };
65
97
  });
66
98
  }
67
99
 
68
- const configurationFileNames = {
69
- home: "shopify.home.toml",
70
- homeTemplate: "shopify.home.template.toml"
71
- };
72
- const blocks = {
73
- home: {
74
- directoryName: "home",
75
- configurationName: configurationFileNames.home
76
- }
77
- };
78
-
79
- async function cleanup(homeOutputDirectory) {
100
+ async function cleanup(webOutputDirectory) {
80
101
  const gitPaths = await path.glob([
81
- path.join(homeOutputDirectory, "**", ".git"),
82
- path.join(homeOutputDirectory, "**", ".github"),
83
- path.join(homeOutputDirectory, "**", ".gitmodules")
102
+ path.join(webOutputDirectory, "**", ".git"),
103
+ path.join(webOutputDirectory, "**", ".github"),
104
+ path.join(webOutputDirectory, "**", ".gitmodules"),
105
+ path.join(webOutputDirectory, "LICENSE*")
84
106
  ], {
85
107
  dot: true,
86
108
  onlyFiles: false,
87
109
  onlyDirectories: false,
88
110
  ignore: ["**/node_modules/**"]
89
111
  });
90
- const templatePaths = await path.glob([
91
- path.join(homeOutputDirectory, "**", "_template"),
92
- path.join(homeOutputDirectory, "**", configurationFileNames.homeTemplate)
93
- ], {
94
- onlyFiles: false,
95
- onlyDirectories: false,
96
- ignore: ["**/node_modules/**"]
97
- });
98
- const pathsToDelete = [...gitPaths, ...templatePaths];
99
- return Promise.all(pathsToDelete.map((path2) => file.rmdir(path2, { force: true }))).then(() => {
112
+ return Promise.all(gitPaths.map((path2) => file.rmdir(path2, { force: true }))).then(() => {
100
113
  });
101
114
  }
102
115
 
103
116
  async function init(options) {
104
- const user = await os.username() ?? "";
105
- const templatePath = await template("app");
106
- let cliPackageVersion = constants.versions.cli;
107
- let appPackageVersion = constants.versions.app;
108
- const dependencyOverrides = {};
109
- if (options.local) {
110
- cliPackageVersion = `file:${await path.findUp("packages/cli", { type: "directory" })}`;
111
- appPackageVersion = `file:${await path.findUp("packages/app", { type: "directory" })}`;
112
- dependencyOverrides["@shopify/cli"] = cliPackageVersion;
113
- dependencyOverrides["@shopify/app"] = appPackageVersion;
114
- dependencyOverrides["@shopify/cli-kit"] = `file:${await path.findUp("packages/cli-kit", { type: "directory" })}`;
115
- }
116
117
  const dependencyManager = inferDependencyManager(options.dependencyManager);
117
118
  const hyphenizedName = string.hyphenize(options.name);
118
119
  const outputDirectory = path.join(options.directory, hyphenizedName);
119
120
  await file.inTemporaryDirectory(async (tmpDir) => {
120
- const tmpDirApp = path.join(tmpDir, "app");
121
- const tmpDirHome = path.join(tmpDirApp, blocks.home.directoryName);
122
- const tmpDirDownload = path.join(tmpDir, "download");
123
- await file.mkdir(tmpDirHome);
124
- await file.mkdir(tmpDirDownload);
121
+ const templateDownloadDir = path.join(tmpDir, "download");
122
+ const templateScaffoldDir = path.join(tmpDir, "app");
123
+ await file.mkdir(templateDownloadDir);
125
124
  const list = new ui.Listr([
126
125
  {
127
126
  title: "Downloading template",
128
127
  task: async (_, task) => {
129
- await downloadTemplate({
130
- templateUrl: options.template,
131
- into: tmpDirDownload
128
+ await git.downloadRepository({
129
+ repoUrl: options.template,
130
+ destination: templateDownloadDir
132
131
  });
132
+ task.title = "Template downloaded";
133
133
  }
134
134
  },
135
135
  {
136
136
  title: `Initializing your app ${hyphenizedName}`,
137
- task: async (_, task) => {
138
- await scaffoldTemplate({
139
- ...options,
140
- directory: tmpDirApp,
141
- templatePath,
142
- cliPackageVersion,
143
- appPackageVersion,
144
- user,
145
- dependencyManager,
146
- dependencyOverrides
147
- });
148
- task.title = "App initialized";
149
- }
150
- },
151
- {
152
- title: `Creating home`,
153
- task: async (_, task) => {
154
- const hooksPreFilePaths = await path.glob(path.join(tmpDirDownload, "hooks/pre/*"));
155
- const hooksPostFilePaths = await path.glob(path.join(tmpDirDownload, "hooks/post/*"));
156
- return task.newListr([
137
+ task: async (_, parentTask) => {
138
+ return parentTask.newListr([
157
139
  {
158
- title: "Scaffolding home",
159
- task: async () => {
160
- await scaffoldTemplate({
161
- ...options,
162
- prompts: {},
163
- directory: tmpDirHome,
164
- templatePath: tmpDirDownload,
165
- cliPackageVersion,
166
- appPackageVersion,
167
- user,
168
- dependencyManager,
169
- dependencyOverrides
140
+ title: "Parsing liquid",
141
+ task: async (_2, task) => {
142
+ await template.recursiveDirectoryCopy(templateDownloadDir, templateScaffoldDir, {
143
+ dependency_manager: dependencyManager
170
144
  });
145
+ task.title = "Liquid parsed";
171
146
  }
172
147
  },
173
- ...hooksPreFilePaths.map((sourcePath) => {
174
- const hookPath = path.join(tmpDirHome, path.relative(tmpDirDownload, sourcePath)).replace(".liquid", "");
175
- return {
176
- title: path.basename(hookPath),
177
- task: async (_2, task2) => {
178
- const stdout = new Writable({
179
- write(chunk, encoding, next) {
180
- task2.output = chunk.toString();
181
- next();
182
- }
183
- });
184
- const stderr = new Writable({
185
- write(chunk, encoding, next) {
186
- task2.output = chunk.toString();
187
- next();
188
- }
189
- });
190
- await system.exec(hookPath, [], { cwd: tmpDirHome, stdout, stderr });
191
- }
192
- };
193
- }),
194
- ...hooksPostFilePaths.map((sourcePath) => {
195
- const hookPath = path.join(tmpDirHome, path.relative(tmpDirDownload, sourcePath)).replace(".liquid", "");
196
- return {
197
- title: path.basename(hookPath),
198
- task: async (_2, task2) => {
199
- const stdout = new Writable({
200
- write(chunk, encoding, next) {
201
- task2.output = chunk.toString();
202
- next();
203
- }
204
- });
205
- const stderr = new Writable({
206
- write(chunk, encoding, next) {
207
- task2.output = chunk.toString();
208
- next();
209
- }
210
- });
211
- await system.exec(hookPath, [], { cwd: tmpDirHome, stdout, stderr });
212
- }
213
- };
214
- }),
215
148
  {
216
- title: "Cleaning up home",
217
- task: async () => {
218
- await cleanup(tmpDirHome);
149
+ title: "Updating package.json",
150
+ task: async (_2, task) => {
151
+ const packageJSON = await npm.readPackageJSON(templateScaffoldDir);
152
+ await npm.updateAppData(packageJSON, hyphenizedName);
153
+ await updateCLIDependencies(packageJSON, options.local);
154
+ await npm.writePackageJSON(templateScaffoldDir, packageJSON);
155
+ task.title = "Package.json updated";
156
+ parentTask.title = "App initialized";
219
157
  }
220
158
  }
221
159
  ]);
222
160
  }
223
161
  },
224
162
  {
225
- title: `Installing app dependencies with ${dependencyManager}`,
163
+ title: `Installing dependencies with ${dependencyManager}`,
164
+ task: async (_, parentTask) => {
165
+ function didInstallEverything() {
166
+ parentTask.title = `Dependencies installed with ${dependencyManager}`;
167
+ }
168
+ return parentTask.newListr(await getDeepInstallNPMTasks({
169
+ from: templateScaffoldDir,
170
+ dependencyManager,
171
+ didInstallEverything
172
+ }), { concurrent: false });
173
+ }
174
+ },
175
+ {
176
+ title: "Cleaning up",
226
177
  task: async (_, task) => {
227
- const output2 = new Writable({
228
- write(chunk, encoding, next) {
229
- task.output = chunk.toString();
230
- next();
231
- }
232
- });
233
- await dependency.install(tmpDirApp, dependencyManager, output2, output2);
178
+ await cleanup(templateScaffoldDir);
179
+ task.title = "Completed clean up";
234
180
  }
235
181
  }
236
182
  ], { concurrent: false });
237
183
  await list.run();
238
- await file.move(tmpDirApp, outputDirectory);
184
+ await file.move(templateScaffoldDir, outputDirectory);
239
185
  });
240
186
  output.info(output.content`
241
187
  ${hyphenizedName} is ready to build! ✨
@@ -249,18 +195,6 @@ function inferDependencyManager(optionsDependencyManager) {
249
195
  }
250
196
  return dependency.dependencyManagerUsedForCreating();
251
197
  }
252
- async function scaffoldTemplate(options) {
253
- const templateData = {
254
- name: options.name,
255
- shopify_cli_version: options.cliPackageVersion,
256
- shopify_app_version: options.appPackageVersion,
257
- dependency_overrides: options.dependencyOverrides,
258
- author: options.user,
259
- dependency_manager: options.dependencyManager,
260
- ...options.prompts
261
- };
262
- await template$1.recursiveDirectoryCopy(options.templatePath, options.directory, templateData);
263
- }
264
198
 
265
199
  const _Init = class extends Command {
266
200
  async run() {
@@ -281,6 +215,7 @@ const _Init = class extends Command {
281
215
  };
282
216
  let Init = _Init;
283
217
  Init.flags = {
218
+ ...cli.globalFlags,
284
219
  name: Flags.string({
285
220
  char: "n",
286
221
  env: "SHOPIFY_FLAG_NAME",
@@ -293,7 +228,7 @@ Init.flags = {
293
228
  hidden: false
294
229
  }),
295
230
  template: Flags.string({
296
- description: "The template for app home. Eg, --template https://github.com/Shopify/shopify-app-node",
231
+ description: "The app template. Eg, --template https://github.com/Shopify/shopify-app-node",
297
232
  env: "SHOPIFY_FLAG_TEMPLATE"
298
233
  }),
299
234
  "dependency-manager": Flags.string({
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sources":["../../src/prompts/init.ts","../../src/utils/paths.ts","../../src/utils/home-template/download.ts","../../src/constants.ts","../../src/utils/home-template/cleanup.ts","../../src/services/init.ts","../../src/commands/init.ts"],"sourcesContent":["import {ui} from '@shopify/cli-kit'\n\ninterface InitOptions {\n name?: string\n template?: string\n}\n\ninterface InitOutput {\n name: string\n template: string\n}\n\nconst init = async (options: InitOptions, prompt = ui.prompt): Promise<InitOutput> => {\n const questions: ui.Question[] = []\n if (!options.name) {\n questions.push({\n type: 'input',\n name: 'name',\n message: \"Your app's working name?\",\n default: 'app',\n validate: (value) => {\n if (value.length === 0) {\n return 'App Name cannot be empty'\n }\n if (value.length > 30) {\n return 'App name is too long (maximum is 30 characters)'\n }\n return true\n },\n })\n }\n if (!options.template) {\n questions.push({\n type: 'select',\n name: 'template',\n choices: ['node', 'rails'],\n message: 'Which template would you like to use?',\n default: 'https://github.com/Shopify/shopify-app-node#cli-next',\n })\n }\n const promptOutput: InitOutput = await prompt(questions)\n return {...options, ...promptOutput, template: 'https://github.com/Shopify/shopify-app-node#cli-next'}\n}\n\nexport default init\n","import {path, error} from '@shopify/cli-kit'\nimport {fileURLToPath} from 'url'\n\nexport async function template(name: string): Promise<string> {\n const templatePath = await path.findUp(`templates/${name}`, {\n cwd: path.dirname(fileURLToPath(import.meta.url)),\n type: 'directory',\n })\n if (templatePath) {\n return templatePath\n } else {\n throw new error.Bug(`Couldn't find the template ${name} in @shopify/create-app.`)\n }\n}\n","import {git} from '@shopify/cli-kit'\n\nexport default async function downloadTemplate({templateUrl, into}: {templateUrl: string; into: string}) {\n const components = templateUrl.split('#')\n let branch: string | undefined\n const repository = components[0]\n if (components.length === 2) {\n branch = components[1]\n }\n const options: any = {'--recurse-submodules': null}\n if (branch) {\n options['--branch'] = branch\n }\n\n await git.factory().clone(repository, into, options, (err) => {\n if (err) {\n throw new Error(err.message)\n }\n })\n}\n","export const configurationFileNames = {\n home: 'shopify.home.toml',\n homeTemplate: 'shopify.home.template.toml',\n}\n\nexport const blocks = {\n home: {\n directoryName: 'home',\n configurationName: configurationFileNames.home,\n },\n}\n","import {configurationFileNames} from '../../constants'\nimport {file, path} from '@shopify/cli-kit'\n\nexport default async function cleanup(homeOutputDirectory: string) {\n const gitPaths = await path.glob(\n [\n path.join(homeOutputDirectory, '**', '.git'),\n path.join(homeOutputDirectory, '**', '.github'),\n path.join(homeOutputDirectory, '**', '.gitmodules'),\n ],\n {\n dot: true,\n onlyFiles: false,\n onlyDirectories: false,\n ignore: ['**/node_modules/**'],\n },\n )\n\n const templatePaths = await path.glob(\n [\n path.join(homeOutputDirectory, '**', '_template'),\n path.join(homeOutputDirectory, '**', configurationFileNames.homeTemplate),\n ],\n {\n onlyFiles: false,\n onlyDirectories: false,\n ignore: ['**/node_modules/**'],\n },\n )\n\n const pathsToDelete = [...gitPaths, ...templatePaths]\n\n return Promise.all(pathsToDelete.map((path) => file.rmdir(path, {force: true}))).then(() => {})\n}\n","import {template as getTemplatePath} from '../utils/paths'\nimport downloadTemplate from '../utils/home-template/download'\nimport cleanupHome from '../utils/home-template/cleanup'\nimport {blocks} from '../constants'\nimport {string, path, template, file, output, os, ui, dependency, constants, system} from '@shopify/cli-kit'\nimport {Writable} from 'stream'\n\ninterface InitOptions {\n name: string\n directory: string\n template: string\n dependencyManager: string | undefined\n local: boolean\n}\n\nasync function init(options: InitOptions) {\n const user = (await os.username()) ?? ''\n const templatePath = await getTemplatePath('app')\n\n let cliPackageVersion = constants.versions.cli\n let appPackageVersion = constants.versions.app\n const dependencyOverrides: {[key: string]: string} = {}\n\n if (options.local) {\n cliPackageVersion = `file:${(await path.findUp('packages/cli', {type: 'directory'})) as string}`\n appPackageVersion = `file:${(await path.findUp('packages/app', {type: 'directory'})) as string}`\n\n dependencyOverrides['@shopify/cli'] = cliPackageVersion\n dependencyOverrides['@shopify/app'] = appPackageVersion\n dependencyOverrides['@shopify/cli-kit'] = `file:${\n (await path.findUp('packages/cli-kit', {type: 'directory'})) as string\n }`\n }\n\n const dependencyManager = inferDependencyManager(options.dependencyManager)\n const hyphenizedName = string.hyphenize(options.name)\n const outputDirectory = path.join(options.directory, hyphenizedName)\n\n await file.inTemporaryDirectory(async (tmpDir) => {\n const tmpDirApp = path.join(tmpDir, 'app')\n const tmpDirHome = path.join(tmpDirApp, blocks.home.directoryName)\n const tmpDirDownload = path.join(tmpDir, 'download')\n\n await file.mkdir(tmpDirHome)\n await file.mkdir(tmpDirDownload)\n\n const list = new ui.Listr(\n [\n {\n title: 'Downloading template',\n task: async (_, task) => {\n await downloadTemplate({\n templateUrl: options.template,\n into: tmpDirDownload,\n })\n },\n },\n {\n title: `Initializing your app ${hyphenizedName}`,\n task: async (_, task) => {\n await scaffoldTemplate({\n ...options,\n directory: tmpDirApp,\n templatePath,\n cliPackageVersion,\n appPackageVersion,\n user,\n dependencyManager,\n dependencyOverrides,\n })\n task.title = 'App initialized'\n },\n },\n {\n title: `Creating home`,\n task: async (_, task) => {\n const hooksPreFilePaths = await path.glob(path.join(tmpDirDownload, 'hooks/pre/*'))\n const hooksPostFilePaths = await path.glob(path.join(tmpDirDownload, 'hooks/post/*'))\n\n return task.newListr([\n {\n title: 'Scaffolding home',\n task: async () => {\n await scaffoldTemplate({\n ...options,\n prompts: {},\n directory: tmpDirHome,\n templatePath: tmpDirDownload,\n cliPackageVersion,\n appPackageVersion,\n user,\n dependencyManager,\n dependencyOverrides,\n })\n },\n },\n ...hooksPreFilePaths.map((sourcePath) => {\n const hookPath = path.join(tmpDirHome, path.relative(tmpDirDownload, sourcePath)).replace('.liquid', '')\n return {\n title: path.basename(hookPath),\n task: async (_: any, task: any) => {\n const stdout = new Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n })\n const stderr = new Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n })\n await system.exec(hookPath, [], {cwd: tmpDirHome, stdout, stderr})\n },\n }\n }),\n ...hooksPostFilePaths.map((sourcePath) => {\n const hookPath = path.join(tmpDirHome, path.relative(tmpDirDownload, sourcePath)).replace('.liquid', '')\n return {\n title: path.basename(hookPath),\n task: async (_: any, task: any) => {\n const stdout = new Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n })\n const stderr = new Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n })\n await system.exec(hookPath, [], {cwd: tmpDirHome, stdout, stderr})\n },\n }\n }),\n {\n title: 'Cleaning up home',\n task: async () => {\n await cleanupHome(tmpDirHome)\n },\n },\n ])\n },\n },\n {\n title: `Installing app dependencies with ${dependencyManager}`,\n task: async (_, task) => {\n const output = new Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n })\n await dependency.install(tmpDirApp, dependencyManager, output, output)\n },\n },\n ],\n {concurrent: false},\n )\n await list.run()\n\n await file.move(tmpDirApp, outputDirectory)\n })\n\n output.info(output.content`\n ${hyphenizedName} is ready to build! ✨\n Docs: ${output.token.link('Quick start guide', 'https://shopify.dev/apps/getting-started')}\n Inspiration ${output.token.command(`${dependencyManager} shopify help`)}\n `)\n}\n\nfunction inferDependencyManager(optionsDependencyManager: string | undefined): dependency.DependencyManager {\n if (optionsDependencyManager && dependency.dependencyManager.includes(optionsDependencyManager)) {\n return optionsDependencyManager as dependency.DependencyManager\n }\n return dependency.dependencyManagerUsedForCreating()\n}\n\nasync function scaffoldTemplate(\n options: InitOptions & {\n directory: string\n prompts?: {[key: string]: string | number | boolean}\n templatePath: string\n cliPackageVersion: string\n appPackageVersion: string\n dependencyOverrides: {[key: string]: string}\n user: string\n dependencyManager: string\n },\n): Promise<void> {\n const templateData = {\n name: options.name,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n shopify_cli_version: options.cliPackageVersion,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n shopify_app_version: options.appPackageVersion,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dependency_overrides: options.dependencyOverrides,\n author: options.user,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dependency_manager: options.dependencyManager,\n ...options.prompts,\n }\n await template.recursiveDirectoryCopy(options.templatePath, options.directory, templateData)\n}\n\nexport default init\n","import initPrompt from '../prompts/init'\nimport initService from '../services/init'\nimport {Command, Flags} from '@oclif/core'\nimport {path} from '@shopify/cli-kit'\n\nexport default class Init extends Command {\n static flags = {\n name: Flags.string({\n char: 'n',\n env: 'SHOPIFY_FLAG_NAME',\n hidden: false,\n }),\n path: Flags.string({\n char: 'p',\n env: 'SHOPIFY_FLAG_PATH',\n parse: (input, _) => Promise.resolve(path.resolve(input)),\n hidden: false,\n }),\n template: Flags.string({\n description: 'The template for app home. Eg, --template https://github.com/Shopify/shopify-app-node',\n env: 'SHOPIFY_FLAG_TEMPLATE',\n }),\n 'dependency-manager': Flags.string({\n char: 'd',\n env: 'SHOPIFY_FLAG_DEPENDENCY_MANAGER',\n hidden: false,\n options: ['npm', 'yarn', 'pnpm'],\n }),\n local: Flags.boolean({\n char: 'l',\n env: 'SHOPIFY_FLAG_LOCAL',\n default: false,\n hidden: true,\n }),\n }\n\n async run(): Promise<void> {\n const {flags} = await this.parse(Init)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n const promptAnswers = await initPrompt({\n name: flags.name,\n template: flags.template,\n })\n await initService({\n name: promptAnswers.name,\n dependencyManager: flags['dependency-manager'],\n template: promptAnswers.template,\n local: flags.local,\n directory,\n })\n }\n}\n"],"names":["init","getTemplatePath","cleanupHome","template","initPrompt","initService"],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sources":["../../src/prompts/init.ts","../../src/utils/template/npm.ts","../../src/utils/template/cleanup.ts","../../src/services/init.ts","../../src/commands/init.ts"],"sourcesContent":["import {ui} from '@shopify/cli-kit'\n\ninterface InitOptions {\n name?: string\n template?: string\n}\n\ninterface InitOutput {\n name: string\n template: string\n}\n\nconst init = async (options: InitOptions, prompt = ui.prompt): Promise<InitOutput> => {\n // Eventually this list should be taken from a remote location\n // That way we don't have to update the CLI every time we add a template\n const templateURLMap = {\n node: 'https://github.com/Shopify/starter-node-app',\n }\n\n const defaults = {\n name: 'app',\n template: templateURLMap.node,\n }\n\n const questions: ui.Question[] = []\n if (!options.name) {\n questions.push({\n type: 'input',\n name: 'name',\n message: \"Your app's working name?\",\n default: defaults.name,\n validate: (value) => {\n if (value.length === 0) {\n return 'App Name cannot be empty'\n }\n if (value.length > 30) {\n return 'App name is too long (maximum is 30 characters)'\n }\n return true\n },\n })\n }\n\n if (!options.template && Object.keys(templateURLMap).length > 1) {\n questions.push({\n type: 'select',\n name: 'template',\n choices: Object.keys(templateURLMap),\n message: 'Which template would you like to use?',\n default: defaults.template,\n })\n }\n\n const promptOutput: InitOutput = await prompt(questions)\n const answers = {\n ...options,\n ...promptOutput,\n }\n\n const templateURL = templateURLMap[answers.template as keyof typeof templateURLMap]\n answers.template = templateURL || answers.template || defaults.template\n\n return answers\n}\n\nexport default init\n","import {constants, path, dependency, ui, npm} from '@shopify/cli-kit'\nimport {Writable} from 'stream'\n\nexport async function updateCLIDependencies(packageJSON: npm.PackageJSON, local: boolean): Promise<npm.PackageJSON> {\n packageJSON.dependencies = packageJSON.dependencies || {}\n packageJSON.dependencies['@shopify/cli'] = constants.versions.cli\n packageJSON.dependencies['@shopify/app'] = constants.versions.app\n\n if (local) {\n const cliPath = `file:${(await path.findUp('packages/cli', {type: 'directory'})) as string}`\n const appPath = `file:${(await path.findUp('packages/app', {type: 'directory'})) as string}`\n const cliKitPath = `file:${(await path.findUp('packages/cli-kit', {type: 'directory'})) as string}`\n\n // eslint-disable-next-line require-atomic-updates\n packageJSON.dependencies['@shopify/cli'] = cliPath\n // eslint-disable-next-line require-atomic-updates\n packageJSON.dependencies['@shopify/app'] = appPath\n\n const dependencyOverrides = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@shopify/cli': cliPath,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@shopify/app': appPath,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@shopify/cli-kit': cliKitPath,\n }\n\n packageJSON.overrides = packageJSON.overrides\n ? {...packageJSON.overrides, ...dependencyOverrides}\n : dependencyOverrides\n\n packageJSON.resolutions = packageJSON.resolutions\n ? {...packageJSON.resolutions, ...dependencyOverrides}\n : dependencyOverrides\n }\n\n return packageJSON\n}\n\nexport async function getDeepInstallNPMTasks({\n from,\n dependencyManager,\n didInstallEverything,\n}: {\n from: string\n dependencyManager: dependency.DependencyManager\n didInstallEverything(): void\n}): Promise<ui.ListrTask[]> {\n const packageJSONFiles = await path.glob([path.join(from, '**/package.json')])\n let foldersInstalled = 0\n\n return packageJSONFiles.map((filePath) => {\n const folderPath = filePath.replace('package.json', '')\n const titlePath = folderPath.replace(from, '')\n\n return {\n title: `Installing dependencies in ${titlePath}`,\n task: async (_, task) => {\n const output = new Writable({\n write(chunk, _, next) {\n task.output = chunk.toString()\n next()\n },\n })\n\n await dependency.install(folderPath, dependencyManager, output, output)\n\n task.title = `Installed dependencies in ${titlePath}`\n\n foldersInstalled++\n\n if (foldersInstalled === packageJSONFiles.length) {\n didInstallEverything()\n }\n },\n }\n })\n}\n","import {file, path} from '@shopify/cli-kit'\n\nexport default async function cleanup(webOutputDirectory: string) {\n const gitPaths = await path.glob(\n [\n path.join(webOutputDirectory, '**', '.git'),\n path.join(webOutputDirectory, '**', '.github'),\n path.join(webOutputDirectory, '**', '.gitmodules'),\n path.join(webOutputDirectory, 'LICENSE*'),\n ],\n {\n dot: true,\n onlyFiles: false,\n onlyDirectories: false,\n ignore: ['**/node_modules/**'],\n },\n )\n\n return Promise.all(gitPaths.map((path) => file.rmdir(path, {force: true}))).then(() => {})\n}\n","import {getDeepInstallNPMTasks, updateCLIDependencies} from '../utils/template/npm'\nimport cleanup from '../utils/template/cleanup'\n\nimport {string, path, file, output, ui, dependency, template, npm, git} from '@shopify/cli-kit'\n\ninterface InitOptions {\n name: string\n directory: string\n template: string\n dependencyManager: string | undefined\n local: boolean\n}\n\nasync function init(options: InitOptions) {\n const dependencyManager = inferDependencyManager(options.dependencyManager)\n const hyphenizedName = string.hyphenize(options.name)\n const outputDirectory = path.join(options.directory, hyphenizedName)\n\n await file.inTemporaryDirectory(async (tmpDir) => {\n const templateDownloadDir = path.join(tmpDir, 'download')\n const templateScaffoldDir = path.join(tmpDir, 'app')\n\n await file.mkdir(templateDownloadDir)\n\n const list = new ui.Listr(\n [\n {\n title: 'Downloading template',\n task: async (_, task) => {\n await git.downloadRepository({\n repoUrl: options.template,\n destination: templateDownloadDir,\n })\n task.title = 'Template downloaded'\n },\n },\n {\n title: `Initializing your app ${hyphenizedName}`,\n task: async (_, parentTask) => {\n return parentTask.newListr([\n {\n title: 'Parsing liquid',\n task: async (_, task) => {\n await template.recursiveDirectoryCopy(templateDownloadDir, templateScaffoldDir, {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dependency_manager: dependencyManager,\n })\n\n task.title = 'Liquid parsed'\n },\n },\n {\n title: 'Updating package.json',\n task: async (_, task) => {\n const packageJSON = await npm.readPackageJSON(templateScaffoldDir)\n\n await npm.updateAppData(packageJSON, hyphenizedName)\n await updateCLIDependencies(packageJSON, options.local)\n\n await npm.writePackageJSON(templateScaffoldDir, packageJSON)\n\n task.title = 'Package.json updated'\n parentTask.title = 'App initialized'\n },\n },\n ])\n },\n },\n {\n title: `Installing dependencies with ${dependencyManager}`,\n task: async (_, parentTask) => {\n function didInstallEverything() {\n parentTask.title = `Dependencies installed with ${dependencyManager}`\n }\n\n return parentTask.newListr(\n await getDeepInstallNPMTasks({\n from: templateScaffoldDir,\n dependencyManager,\n didInstallEverything,\n }),\n {concurrent: false},\n )\n },\n },\n {\n title: 'Cleaning up',\n task: async (_, task) => {\n await cleanup(templateScaffoldDir)\n\n task.title = 'Completed clean up'\n },\n },\n ],\n {concurrent: false},\n )\n await list.run()\n\n await file.move(templateScaffoldDir, outputDirectory)\n })\n\n output.info(output.content`\n ${hyphenizedName} is ready to build! ✨\n Docs: ${output.token.link('Quick start guide', 'https://shopify.dev/apps/getting-started')}\n Inspiration ${output.token.command(`${dependencyManager} shopify help`)}\n `)\n}\n\nfunction inferDependencyManager(optionsDependencyManager: string | undefined): dependency.DependencyManager {\n if (optionsDependencyManager && dependency.dependencyManager.includes(optionsDependencyManager)) {\n return optionsDependencyManager as dependency.DependencyManager\n }\n return dependency.dependencyManagerUsedForCreating()\n}\n\nexport default init\n","import initPrompt from '../prompts/init'\nimport initService from '../services/init'\nimport {Command, Flags} from '@oclif/core'\nimport {path, cli} from '@shopify/cli-kit'\n\nexport default class Init extends Command {\n static flags = {\n ...cli.globalFlags,\n name: Flags.string({\n char: 'n',\n env: 'SHOPIFY_FLAG_NAME',\n hidden: false,\n }),\n path: Flags.string({\n char: 'p',\n env: 'SHOPIFY_FLAG_PATH',\n parse: (input, _) => Promise.resolve(path.resolve(input)),\n hidden: false,\n }),\n template: Flags.string({\n description: 'The app template. Eg, --template https://github.com/Shopify/shopify-app-node',\n env: 'SHOPIFY_FLAG_TEMPLATE',\n }),\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'dependency-manager': Flags.string({\n char: 'd',\n env: 'SHOPIFY_FLAG_DEPENDENCY_MANAGER',\n hidden: false,\n options: ['npm', 'yarn', 'pnpm'],\n }),\n local: Flags.boolean({\n char: 'l',\n env: 'SHOPIFY_FLAG_LOCAL',\n default: false,\n hidden: true,\n }),\n }\n\n async run(): Promise<void> {\n const {flags} = await this.parse(Init)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n const promptAnswers = await initPrompt({\n name: flags.name,\n template: flags.template,\n })\n await initService({\n name: promptAnswers.name,\n dependencyManager: flags['dependency-manager'],\n template: promptAnswers.template,\n local: flags.local,\n directory,\n })\n }\n}\n"],"names":["init","initPrompt","initService"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import {run, flush, settings} from '@oclif/core'\nimport {error as kitError, environment} from '@shopify/cli-kit'\n\nfunction runCreateApp() {\n const initIndex = process.argv.findIndex((arg) => arg.includes('init'))\n if (initIndex === -1) {\n const initIndex =\n process.argv.findIndex(\n (arg) => arg.includes('bin/create-app') || arg.includes('bin/dev') || arg.includes('bin/run'),\n ) + 1\n process.argv.splice(initIndex, 0, 'init')\n }\n\n if (environment.local.isDebug()) {\n settings.debug = true\n }\n\n // Start the CLI\n run(undefined, import.meta.url)\n .then(flush)\n .catch((error: Error): Promise<void | Error> => {\n const kitMapper = kitError.mapper\n const kitHandle = kitError.handler\n // eslint-disable-next-line promise/no-nesting\n return kitMapper(error).then((error: Error) => {\n kitHandle(error)\n })\n })\n}\n\nexport default runCreateApp\n"],"names":["error","kitError"],"mappings":";;;AAEA,SAAS,YAAY,GAAG;AACxB,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E,EAAE,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;AACxB,IAAI,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;AACjJ,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/C,GAAG;AACH,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;AACnC,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;AAC1B,GAAG;AACH,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAACA,OAAK,KAAK;AAC5D,IAAI,MAAM,SAAS,GAAGC,KAAQ,CAAC,MAAM,CAAC;AACtC,IAAI,MAAM,SAAS,GAAGA,KAAQ,CAAC,OAAO,CAAC;AACvC,IAAI,OAAO,SAAS,CAACD,OAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK;AAC7C,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;AACxB,KAAK,CAAC,CAAC;AACP,GAAG,CAAC,CAAC;AACL;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import {run, flush, settings} from '@oclif/core'\nimport {error as kitError, environment} from '@shopify/cli-kit'\n\nfunction runCreateApp() {\n const initIndex = process.argv.findIndex((arg) => arg.includes('init'))\n if (initIndex === -1) {\n const initIndex =\n process.argv.findIndex(\n (arg) => arg.includes('bin/create-app') || arg.includes('bin/dev') || arg.includes('bin/run'),\n ) + 1\n process.argv.splice(initIndex, 0, 'init')\n }\n\n if (environment.local.isDebug()) {\n settings.debug = true\n }\n\n // Start the CLI\n run(undefined, import.meta.url)\n .then(flush)\n .catch((error: Error): Promise<void | Error> => {\n const kitMapper = kitError.mapper\n const kitHandle = kitError.handler\n // eslint-disable-next-line promise/no-nesting\n return kitMapper(error).then((error: Error) => {\n kitHandle(error)\n })\n })\n}\n\nexport default runCreateApp\n"],"names":["error","kitError"],"mappings":";;;AAGA,SAAwB,YAAA,GAAA;AACtB,EAAM,MAAA,SAAA,GAAY,QAAQ,IAAK,CAAA,SAAA,CAAU,CAAC,GAAQ,KAAA,GAAA,CAAI,QAAS,CAAA,MAAM,CAAC,CAAA,CAAA;AACtE,EAAA,IAAI,cAAc,CAAI,CAAA,EAAA;AACpB,IAAA,MAAM,aACJ,OAAQ,CAAA,IAAA,CAAK,UACX,CAAC,GAAA,KAAQ,IAAI,QAAS,CAAA,gBAAgB,CAAK,IAAA,GAAA,CAAI,SAAS,SAAS,CAAA,IAAK,IAAI,QAAS,CAAA,SAAS,CAC9F,CAAI,GAAA,CAAA,CAAA;AACN,IAAA,OAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,UAAW,EAAA,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,GAC1C;AAEA,EAAI,IAAA,WAAA,CAAY,KAAM,CAAA,OAAA,EAAW,EAAA;AAC/B,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AAAA,GACnB;AAGA,EAAI,GAAA,CAAA,KAAA,CAAA,EAAW,YAAY,GAAG,CAAA,CAC3B,KAAK,KAAK,CAAA,CACV,KAAM,CAAA,CAACA,OAAwC,KAAA;AAC9C,IAAA,MAAM,YAAYC,KAAS,CAAA,MAAA,CAAA;AAC3B,IAAA,MAAM,YAAYA,KAAS,CAAA,OAAA,CAAA;AAE3B,IAAA,OAAO,SAAU,CAAAD,OAAK,CAAE,CAAA,IAAA,CAAK,CAAC,MAAiB,KAAA;AAC7C,MAAA,SAAA,CAAU,MAAK,CAAA,CAAA;AAAA,KAChB,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACL;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/create-app",
3
- "version": "1.0.9",
3
+ "version": "2.0.2",
4
4
  "private": false,
5
5
  "description": "A CLI tool to create a new Shopify app.",
6
6
  "type": "module",
@@ -24,7 +24,6 @@
24
24
  "/bin/run.js",
25
25
  "/bin/run.cmd",
26
26
  "/dist",
27
- "templates",
28
27
  "/oclif.manifest.json"
29
28
  ],
30
29
  "publishConfig": {
@@ -48,15 +47,15 @@
48
47
  },
49
48
  "dependencies": {
50
49
  "@bugsnag/js": "^7.16.2",
51
- "@oclif/core": "1.6.4",
52
- "@shopify/cli-kit": "1.0.9"
50
+ "@oclif/core": "1.7.0",
51
+ "@shopify/cli-kit": "2.0.2"
53
52
  },
54
53
  "devDependencies": {
55
- "vitest": "0.8.1"
54
+ "vitest": "0.10.0"
56
55
  },
57
56
  "engine-strict": true,
58
57
  "engines": {
59
- "node": "^14.13.1 || ^16.0.0 || ^17.0.0"
58
+ "node": "^14.13.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
60
59
  },
61
60
  "os": [
62
61
  "darwin",
@@ -65,6 +64,9 @@
65
64
  ],
66
65
  "oclif": {
67
66
  "bin": "create-app",
68
- "commands": "./dist/commands"
67
+ "commands": "./dist/commands",
68
+ "additionalHelpFlags": [
69
+ "-h"
70
+ ]
69
71
  }
70
72
  }
@@ -1,184 +0,0 @@
1
- ### macOS ###
2
- # General
3
- .DS_Store
4
- .AppleDouble
5
- .LSOverride
6
-
7
- # Icon must end with two \r
8
- Icon
9
-
10
-
11
- # Thumbnails
12
- ._*
13
-
14
- # Files that might appear in the root of a volume
15
- .DocumentRevisions-V100
16
- .fseventsd
17
- .Spotlight-V100
18
- .TemporaryItems
19
- .Trashes
20
- .VolumeIcon.icns
21
- .com.apple.timemachine.donotpresent
22
-
23
- # Directories potentially created on remote AFP share
24
- .AppleDB
25
- .AppleDesktop
26
- Network Trash Folder
27
- Temporary Items
28
- .apdisk
29
-
30
- ### Node ###
31
- # Logs
32
- logs
33
- *.log
34
- npm-debug.log*
35
- yarn-debug.log*
36
- yarn-error.log*
37
- lerna-debug.log*
38
- .pnpm-debug.log*
39
-
40
- # Diagnostic reports (https://nodejs.org/api/report.html)
41
- report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
42
-
43
- # Runtime data
44
- pids
45
- *.pid
46
- *.seed
47
- *.pid.lock
48
-
49
- # Directory for instrumented libs generated by jscoverage/JSCover
50
- lib-cov
51
-
52
- # Coverage directory used by tools like istanbul
53
- coverage
54
- *.lcov
55
-
56
- # nyc test coverage
57
- .nyc_output
58
-
59
- # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
60
- .grunt
61
-
62
- # Bower dependency directory (https://bower.io/)
63
- bower_components
64
-
65
- # node-waf configuration
66
- .lock-wscript
67
-
68
- # Compiled binary addons (https://nodejs.org/api/addons.html)
69
- build/Release
70
-
71
- # Dependency directories
72
- node_modules/
73
- jspm_packages/
74
-
75
- # Snowpack dependency directory (https://snowpack.dev/)
76
- web_modules/
77
-
78
- # TypeScript cache
79
- *.tsbuildinfo
80
-
81
- # Optional npm cache directory
82
- .npm
83
-
84
- # Optional eslint cache
85
- .eslintcache
86
-
87
- # Optional stylelint cache
88
- .stylelintcache
89
-
90
- # Microbundle cache
91
- .rpt2_cache/
92
- .rts2_cache_cjs/
93
- .rts2_cache_es/
94
- .rts2_cache_umd/
95
-
96
- # Optional REPL history
97
- .node_repl_history
98
-
99
- # Output of 'npm pack'
100
- *.tgz
101
-
102
- # Yarn Integrity file
103
- .yarn-integrity
104
-
105
- # dotenv environment variable files
106
- .env
107
- .env.development.local
108
- .env.test.local
109
- .env.production.local
110
- .env.local
111
-
112
- # parcel-bundler cache (https://parceljs.org/)
113
- .cache
114
- .parcel-cache
115
-
116
- # Next.js build output
117
- .next
118
- out
119
-
120
- # Nuxt.js build / generate output
121
- .nuxt
122
- dist
123
-
124
- # Gatsby files
125
- .cache/
126
- # Comment in the public line in if your project uses Gatsby and not Next.js
127
- # https://nextjs.org/blog/next-9-1#public-directory-support
128
- # public
129
-
130
- # vuepress build output
131
- .vuepress/dist
132
-
133
- # vuepress v2.x temp and cache directory
134
- .temp
135
-
136
- # Docusaurus cache and generated files
137
- .docusaurus
138
-
139
- # Serverless directories
140
- .serverless/
141
-
142
- # FuseBox cache
143
- .fusebox/
144
-
145
- # DynamoDB Local files
146
- .dynamodb/
147
-
148
- # TernJS port file
149
- .tern-port
150
-
151
- # Stores VSCode versions used for testing VSCode extensions
152
- .vscode-test
153
-
154
- # yarn v2
155
- .yarn/cache
156
- .yarn/unplugged
157
- .yarn/build-state.yml
158
- .yarn/install-state.gz
159
- .pnp.*
160
-
161
- ### Node Patch ###
162
- # Serverless Webpack directories
163
- .webpack/
164
-
165
- # Optional stylelint cache
166
-
167
- # SvelteKit build / generate output
168
- .svelte-kit
169
-
170
- ### react ###
171
- .DS_*
172
- **/*.backup.*
173
- **/*.back.*
174
-
175
- node_modules
176
-
177
- *.sublime*
178
-
179
- psd
180
- thumb
181
- sketch
182
-
183
- # Shopify apps
184
- build
@@ -1,7 +0,0 @@
1
- # {{ name }}
2
-
3
- ## Set up
4
-
5
- 1. Clone the repository.
6
- 2. Install dependencies: `{{dependency_manager}} install`.
7
- 3. Build with `{{dependency_manager}} build`
@@ -1,28 +0,0 @@
1
- {
2
- "name": "{{name}}",
3
- "version": "0.1.0",
4
- "main": "home/index.js",
5
- "license": "UNLICENSED",
6
- "scripts": {
7
- "shopify": "shopify",
8
- "build": "shopify app build",
9
- "dev": "shopify app dev",
10
- "push": "shopify app push",
11
- "scaffold": "shopify app scaffold",
12
- "deploy": "shopify app deploy"
13
- },
14
- "dependencies": {
15
- "@shopify/cli": "{{shopify_cli_version}}",
16
- "@shopify/app": "{{shopify_app_version}}",
17
- "react": "17.0.2"
18
- },{% if dependency_overrides.size > 0 %}{% if dependency_overrides %}
19
- "overrides": {
20
- {% for dependency in dependency_overrides %}
21
- "{{dependency[0]}}": "{{dependency[1]}}"{% unless forloop.last %},{% endunless %}{% endfor %}
22
- },{% endif %}{% endif %}{% if dependency_overrides.size > 0 %}{% if dependency_overrides %}
23
- "resolutions": {
24
- {% for dependency in dependency_overrides %}
25
- "{{dependency[0]}}": "{{dependency[1]}}"{% unless forloop.last %},{% endunless %}{% endfor %}
26
- },{% endif %}{% endif %}
27
- "author": "{{author}}"
28
- }
@@ -1,3 +0,0 @@
1
- # This file stores configurations for your Shopify app.
2
-
3
- name = "{{name}}"