@gooddata/app-toolkit 9.6.0-alpha.8 → 9.6.0-beta.0
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/NOTICE +1027 -1086
- package/esm/__version.d.ts +1 -1
- package/esm/__version.d.ts.map +1 -1
- package/esm/__version.js +1 -1
- package/esm/__version.js.map +1 -1
- package/esm/_base/inputHandling/validators.d.ts +39 -0
- package/esm/_base/inputHandling/validators.d.ts.map +1 -0
- package/esm/_base/inputHandling/validators.js +93 -0
- package/esm/_base/inputHandling/validators.js.map +1 -0
- package/esm/_base/terminal/clear.d.ts +3 -0
- package/esm/_base/terminal/clear.d.ts.map +1 -0
- package/esm/_base/terminal/clear.js +13 -0
- package/esm/_base/terminal/clear.js.map +1 -0
- package/esm/_base/terminal/loggers.d.ts +24 -0
- package/esm/_base/terminal/loggers.d.ts.map +1 -0
- package/esm/_base/terminal/loggers.js +35 -0
- package/esm/_base/terminal/loggers.js.map +1 -0
- package/esm/_base/terminal/prompts.d.ts +9 -0
- package/esm/_base/terminal/prompts.d.ts.map +1 -0
- package/esm/_base/terminal/prompts.js +49 -0
- package/esm/_base/terminal/prompts.js.map +1 -0
- package/esm/_base/types.d.ts +40 -0
- package/esm/_base/types.d.ts.map +1 -0
- package/esm/_base/types.js +24 -0
- package/esm/_base/types.js.map +1 -0
- package/esm/_base/utils.d.ts +31 -0
- package/esm/_base/utils.d.ts.map +1 -0
- package/esm/_base/utils.js +78 -0
- package/esm/_base/utils.js.map +1 -0
- package/esm/_base/workspaceTargetConfig.d.ts +16 -0
- package/esm/_base/workspaceTargetConfig.d.ts.map +1 -0
- package/esm/_base/workspaceTargetConfig.js +12 -0
- package/esm/_base/workspaceTargetConfig.js.map +1 -0
- package/esm/index.d.ts +3 -0
- package/esm/initCmd/actionConfig.d.ts +21 -0
- package/esm/initCmd/actionConfig.d.ts.map +1 -0
- package/esm/initCmd/actionConfig.js +56 -0
- package/esm/initCmd/actionConfig.js.map +1 -0
- package/esm/initCmd/index.d.ts +3 -0
- package/esm/initCmd/index.d.ts.map +1 -0
- package/esm/initCmd/index.js +131 -0
- package/esm/initCmd/index.js.map +1 -0
- package/esm/initCmd/replaceInFiles.d.ts +13 -0
- package/esm/initCmd/replaceInFiles.d.ts.map +1 -0
- package/esm/initCmd/replaceInFiles.js +36 -0
- package/esm/initCmd/replaceInFiles.js.map +1 -0
- package/esm/react-app-template.d.ts +3 -0
- package/esm/react-app-template.d.ts.map +1 -0
- package/esm/react-app-template.js +12 -0
- package/esm/react-app-template.js.map +1 -0
- package/esm/react-app-template.js.tgz +0 -0
- package/esm/react-app-template.ts.tgz +0 -0
- package/package.json +4 -4
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { applicationNameValidator, languageValidator, packageManagerValidator, templateValidator, validOrDie, } from "../_base/inputHandling/validators.js";
|
|
2
|
+
import { promptLanguage, promptName, promptTemplate } from "../_base/terminal/prompts.js";
|
|
3
|
+
function getLanguageFromOptions(options) {
|
|
4
|
+
const { language } = options.commandOpts;
|
|
5
|
+
if (!language) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
validOrDie("language", language, languageValidator);
|
|
9
|
+
return language;
|
|
10
|
+
}
|
|
11
|
+
function getPackageManagerFromOptions(options) {
|
|
12
|
+
const { packageManager } = options.commandOpts;
|
|
13
|
+
if (!packageManager) {
|
|
14
|
+
return "npm";
|
|
15
|
+
}
|
|
16
|
+
validOrDie("packageManager", packageManager, packageManagerValidator);
|
|
17
|
+
return packageManager;
|
|
18
|
+
}
|
|
19
|
+
function getTemplateFromOptions(options) {
|
|
20
|
+
const { template } = options.commandOpts;
|
|
21
|
+
if (!template) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
validOrDie("template", template, templateValidator);
|
|
25
|
+
return template;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* This function will obtain configuration for the application init command. It will do so from the argument
|
|
29
|
+
* and option values passed via CLI and in case vital input is missing by using interactive prompts.
|
|
30
|
+
*
|
|
31
|
+
* The function will first verify all the available options and only then start prompting the user - this
|
|
32
|
+
* is intentional as the CLI should fail fast and not at some arbitrary point after user prompting.
|
|
33
|
+
*
|
|
34
|
+
* @param applicationName - application name (if any) as passed by the user, undefined means no application name on CLI
|
|
35
|
+
* @param options - program & command level options provided by the user via CLI
|
|
36
|
+
*/
|
|
37
|
+
export async function getInitCmdActionConfig(applicationName, options) {
|
|
38
|
+
if (applicationName) {
|
|
39
|
+
validOrDie("app-name", applicationName, applicationNameValidator);
|
|
40
|
+
}
|
|
41
|
+
const languageFromOptions = getLanguageFromOptions(options);
|
|
42
|
+
const packageManagerFromOptions = getPackageManagerFromOptions(options);
|
|
43
|
+
const templateFromOptions = getTemplateFromOptions(options);
|
|
44
|
+
const name = applicationName ?? (await promptName());
|
|
45
|
+
const template = templateFromOptions ?? (await promptTemplate());
|
|
46
|
+
const language = languageFromOptions ?? (await promptLanguage());
|
|
47
|
+
return {
|
|
48
|
+
name,
|
|
49
|
+
language,
|
|
50
|
+
packageManager: packageManagerFromOptions,
|
|
51
|
+
targetDir: options.commandOpts.targetDir,
|
|
52
|
+
skipInstall: options.commandOpts.skipInstall ?? false,
|
|
53
|
+
template,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=actionConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionConfig.js","sourceRoot":"","sources":["../../src/initCmd/actionConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,GACb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE1F,SAAS,sBAAsB,CAAC,OAAsB;IAClD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE;QACX,OAAO,SAAS,CAAC;KACpB;IAED,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEpD,OAAO,QAA6B,CAAC;AACzC,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAsB;IACxD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAE/C,IAAI,CAAC,cAAc,EAAE;QACjB,OAAO,KAAK,CAAC;KAChB;IAED,UAAU,CAAC,gBAAgB,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAEtE,OAAO,cAAyC,CAAC;AACrD,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAsB;IAClD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE;QACX,OAAO,SAAS,CAAC;KACpB;IAED,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEpD,OAAO,QAAuB,CAAC;AACnC,CAAC;AAeD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,eAAmC,EACnC,OAAsB;IAEtB,IAAI,eAAe,EAAE;QACjB,UAAU,CAAC,UAAU,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;KACrE;IAED,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,yBAAyB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE5D,MAAM,IAAI,GAAG,eAAe,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,mBAAmB,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,mBAAmB,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;IAEjE,OAAO;QACH,IAAI;QACJ,QAAQ;QACR,cAAc,EAAE,yBAAyB;QACzC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,KAAK;QACrD,QAAQ;KACX,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/initCmd/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAkC,MAAM,mBAAmB,CAAC;AA+IlF,wBAAsB,aAAa,CAC/B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { logError, logInfo, logSuccess, logWarn } from "../_base/terminal/loggers.js";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import fse from "fs-extra";
|
|
4
|
+
import tar from "tar";
|
|
5
|
+
import { getReactAppTemplateArchive } from "../react-app-template.js";
|
|
6
|
+
import { convertToApplicationDirectory, genericErrorReporter, readJsonSync, writeAsJsonSync, } from "../_base/utils.js";
|
|
7
|
+
import { getInitCmdActionConfig } from "./actionConfig.js";
|
|
8
|
+
import { replaceInFiles } from "./replaceInFiles.js";
|
|
9
|
+
import { sync as spawnSync } from "cross-spawn";
|
|
10
|
+
const archiveNameFunctionByTemplate = {
|
|
11
|
+
"react-app": getReactAppTemplateArchive,
|
|
12
|
+
};
|
|
13
|
+
function unpackProject(target, language, template) {
|
|
14
|
+
const archiveNameFunction = archiveNameFunctionByTemplate[template];
|
|
15
|
+
return fse.mkdirp(target).then((_) => {
|
|
16
|
+
return tar.x({
|
|
17
|
+
file: archiveNameFunction(language),
|
|
18
|
+
strip: 1,
|
|
19
|
+
cwd: target,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The original package.json can be tweaked now. The application name will be used for package name.
|
|
25
|
+
*
|
|
26
|
+
* @param target - target directory where the application template was expanded
|
|
27
|
+
* @param config - config for the initialization action
|
|
28
|
+
*/
|
|
29
|
+
function modifyPackageJson(target, config) {
|
|
30
|
+
const { name } = config;
|
|
31
|
+
const packageJsonFile = path.resolve(target, "package.json");
|
|
32
|
+
const packageJson = readJsonSync(packageJsonFile);
|
|
33
|
+
packageJson.name = name;
|
|
34
|
+
writeAsJsonSync(packageJsonFile, packageJson);
|
|
35
|
+
}
|
|
36
|
+
function performReplacementsInFiles(dir, config) {
|
|
37
|
+
const { language, packageManager } = config;
|
|
38
|
+
const replacements = {
|
|
39
|
+
"README.md": [
|
|
40
|
+
{
|
|
41
|
+
regex: /\{\{packageManager\}\}/g,
|
|
42
|
+
value: packageManager,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
regex: /\{\{language\}\}/g,
|
|
46
|
+
value: language,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
"src/App.tsx": [
|
|
50
|
+
{
|
|
51
|
+
regex: /\[\[language\]\]/g,
|
|
52
|
+
value: language,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
"src/App.jsx": [
|
|
56
|
+
{
|
|
57
|
+
regex: /\[\[language\]\]/g,
|
|
58
|
+
value: language,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
return replaceInFiles(dir, replacements);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Prepares a new project for the application, according to the configuration obtained from CLI and/or by
|
|
66
|
+
* prompting the user.
|
|
67
|
+
*
|
|
68
|
+
* The responsibility of this function is to create target directory, unpack the contents of the
|
|
69
|
+
* appropriate application template archive and then 'massage' the unpacked files and directories:
|
|
70
|
+
*
|
|
71
|
+
* - package json has to be modified
|
|
72
|
+
* - string replacements need to happen in the different files to reflect the renaming
|
|
73
|
+
*
|
|
74
|
+
* @param target - target directory to create application in
|
|
75
|
+
* @param config - config for the initialization action
|
|
76
|
+
*/
|
|
77
|
+
async function prepareProject(target, config) {
|
|
78
|
+
const { language, template } = config;
|
|
79
|
+
await unpackProject(target, language, template);
|
|
80
|
+
modifyPackageJson(target, config);
|
|
81
|
+
await performReplacementsInFiles(target, config);
|
|
82
|
+
}
|
|
83
|
+
function runInstall(target, config) {
|
|
84
|
+
const { skipInstall, packageManager } = config;
|
|
85
|
+
const isNpm = packageManager === "npm";
|
|
86
|
+
if (skipInstall) {
|
|
87
|
+
logWarn(`Skipping installation of application project dependencies. Make sure to run '${packageManager} install' in the application directory before you start developing.`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const args = ["install"];
|
|
92
|
+
if (isNpm) {
|
|
93
|
+
args.push("--legacy-peer-deps");
|
|
94
|
+
logInfo("Command will run with '--legacy-peer-deps' flag.");
|
|
95
|
+
}
|
|
96
|
+
const result = spawnSync(packageManager, args, {
|
|
97
|
+
cwd: target,
|
|
98
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
99
|
+
});
|
|
100
|
+
if (result.status !== 0) {
|
|
101
|
+
logWarn(`New project was created but the installation of dependencies has failed. Troubleshoot the problem in '${target}' and retry '${packageManager} install'.`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
logError(`An internal error has occurred while attempting to install project dependencies: ${e.message}`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function initCmdAction(applicationName, options) {
|
|
112
|
+
try {
|
|
113
|
+
const config = await getInitCmdActionConfig(applicationName, options);
|
|
114
|
+
const { name, targetDir } = config;
|
|
115
|
+
const target = targetDir
|
|
116
|
+
? targetDir
|
|
117
|
+
: path.resolve(process.cwd(), convertToApplicationDirectory(name));
|
|
118
|
+
if (fse.existsSync(target)) {
|
|
119
|
+
logError(`Directory for your new application already exists: ${target}. Either use a different application name or use --target-dir and specify a different directory.`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
await prepareProject(target, config);
|
|
123
|
+
runInstall(target, config);
|
|
124
|
+
logSuccess(`A new project for your application is ready in: ${target}. Check out the package.json and fill in author and description if possible.`);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
genericErrorReporter(e);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/initCmd/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import fse from "fs-extra";
|
|
2
|
+
type ReadFileFn = typeof fse.readFile;
|
|
3
|
+
type WriteFileFn = typeof fse.writeFile;
|
|
4
|
+
export type RegexReplacement = {
|
|
5
|
+
regex: RegExp;
|
|
6
|
+
value: string;
|
|
7
|
+
apply?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export interface FileReplacementSpec extends Record<string, RegexReplacement[] | FileReplacementSpec> {
|
|
10
|
+
}
|
|
11
|
+
export declare function replaceInFiles(initialPath: string, spec: FileReplacementSpec, readFile?: ReadFileFn, writeFile?: WriteFileFn): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=replaceInFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replaceInFiles.d.ts","sourceRoot":"","sources":["../../src/initCmd/replaceInFiles.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,KAAK,UAAU,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtC,KAAK,WAAW,GAAG,OAAO,GAAG,CAAC,SAAS,CAAC;AA8CxC,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAGF,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,CAAC;CAAG;AAExG,wBAAsB,cAAc,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,mBAAmB,EACzB,QAAQ,GAAE,UAAyB,EACnC,SAAS,GAAE,WAA2B,GACvC,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// (C) 2021-2023 GoodData Corporation
|
|
2
|
+
import fse from "fs-extra";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import flatMap from "lodash/flatMap.js";
|
|
5
|
+
import entries from "lodash/entries.js";
|
|
6
|
+
function collectFileReplacements(currentPath, spec) {
|
|
7
|
+
return flatMap(entries(spec), ([key, value]) => {
|
|
8
|
+
const nextPath = path.join(currentPath, key);
|
|
9
|
+
if (Array.isArray(value)) {
|
|
10
|
+
return [{ file: nextPath, replacements: value }];
|
|
11
|
+
}
|
|
12
|
+
return collectFileReplacements(nextPath, value);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function createFileProcessor(readFile, writeFile) {
|
|
16
|
+
return async ({ file, replacements }) => {
|
|
17
|
+
let contents;
|
|
18
|
+
try {
|
|
19
|
+
contents = await readFile(file, { encoding: "utf8", flag: "r" });
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
// ENOENT is fine, allow defining replacements for files that may not exist
|
|
23
|
+
if (e.code === "ENOENT")
|
|
24
|
+
return;
|
|
25
|
+
throw e;
|
|
26
|
+
}
|
|
27
|
+
const replaced = replacements.reduce((acc, { regex, value, apply }) => (apply ?? true ? acc.replace(regex, value) : acc), contents);
|
|
28
|
+
return writeFile(file, replaced, { encoding: "utf8", flag: "w" });
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function replaceInFiles(initialPath, spec, readFile = fse.readFile, writeFile = fse.writeFile) {
|
|
32
|
+
const fileReplacements = collectFileReplacements(initialPath, spec);
|
|
33
|
+
const processor = createFileProcessor(readFile, writeFile);
|
|
34
|
+
await Promise.all(fileReplacements.map(processor));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=replaceInFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replaceInFiles.js","sourceRoot":"","sources":["../../src/initCmd/replaceInFiles.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,mBAAmB,CAAC;AACxC,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAYxC,SAAS,uBAAuB,CAAC,WAAmB,EAAE,IAAyB;IAC3E,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;SACpD;QAED,OAAO,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAoB,EAAE,SAAsB;IACrE,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QACpC,IAAI,QAAQ,CAAC;QACb,IAAI;YACA,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACpE;QAAC,OAAO,CAAM,EAAE;YACb,2EAA2E;YAC3E,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAEhC,MAAM,CAAC,CAAC;SACX;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EACnF,QAAQ,CACX,CAAC;QAEF,OAAO,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;AACN,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,WAAmB,EACnB,IAAyB,EACzB,WAAuB,GAAG,CAAC,QAAQ,EACnC,YAAyB,GAAG,CAAC,SAAS;IAEtC,MAAM,gBAAgB,GAAuB,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACxF,MAAM,SAAS,GAA6B,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAErF,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-app-template.d.ts","sourceRoot":"","sources":["../src/react-app-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAYrD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAE9E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { fileURLToPath } from "url";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = path.dirname(__filename);
|
|
5
|
+
/*
|
|
6
|
+
* This file is intentionally named and located in the root to reflect the location of the archives
|
|
7
|
+
* that contain the template project.
|
|
8
|
+
*/
|
|
9
|
+
export function getReactAppTemplateArchive(language) {
|
|
10
|
+
return path.join(__dirname, `react-app-template.${language}.tgz`);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=react-app-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-app-template.js","sourceRoot":"","sources":["../src/react-app-template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;GAGG;AAEH,MAAM,UAAU,0BAA0B,CAAC,QAA2B;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,QAAQ,MAAM,CAAC,CAAC;AACtE,CAAC"}
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/app-toolkit",
|
|
3
|
-
"version": "9.6.0-
|
|
3
|
+
"version": "9.6.0-beta.0",
|
|
4
4
|
"author": "GoodData",
|
|
5
5
|
"description": "CLI with useful tools for creating and maintaining GoodData web applications.",
|
|
6
6
|
"repository": {
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"tar": "^6.1.11",
|
|
45
45
|
"tslib": "^2.5.0",
|
|
46
46
|
"validate-npm-package-name": "^5.0.0",
|
|
47
|
-
"@gooddata/sdk-backend-spi": "9.6.0-
|
|
48
|
-
"@gooddata/sdk-backend-tiger": "9.6.0-
|
|
49
|
-
"@gooddata/sdk-model": "9.6.0-
|
|
47
|
+
"@gooddata/sdk-backend-spi": "9.6.0-beta.0",
|
|
48
|
+
"@gooddata/sdk-backend-tiger": "9.6.0-beta.0",
|
|
49
|
+
"@gooddata/sdk-model": "9.6.0-beta.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@gooddata/eslint-config": "^4.1.0",
|