@contember/cli 2.0.0-alpha.20 → 2.0.0-alpha.21
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/Dockerfile +1 -1
- package/dist/development/src/commands/deploy/DeployCommand.cjs +5 -5
- package/dist/development/src/commands/deploy/DeployCommand.cjs.map +1 -1
- package/dist/development/src/commands/deploy/DeployCommand.js +5 -5
- package/dist/development/src/commands/deploy/DeployCommand.js.map +1 -1
- package/dist/development/src/lib/admin/AdminClient.cjs +1 -1
- package/dist/development/src/lib/admin/AdminClient.cjs.map +1 -1
- package/dist/development/src/lib/admin/AdminClient.js +1 -1
- package/dist/development/src/lib/admin/AdminClient.js.map +1 -1
- package/dist/development/src/lib/project/RemoteProjectResolver.cjs +6 -2
- package/dist/development/src/lib/project/RemoteProjectResolver.cjs.map +1 -1
- package/dist/development/src/lib/project/RemoteProjectResolver.js +6 -2
- package/dist/development/src/lib/project/RemoteProjectResolver.js.map +1 -1
- package/dist/development/src/lib/project/docs/projectDescribe.cjs +3 -5
- package/dist/development/src/lib/project/docs/projectDescribe.cjs.map +1 -1
- package/dist/development/src/lib/project/docs/projectDescribe.js +3 -4
- package/dist/development/src/lib/project/docs/projectDescribe.js.map +1 -1
- package/dist/production/src/commands/deploy/DeployCommand.cjs +5 -5
- package/dist/production/src/commands/deploy/DeployCommand.cjs.map +1 -1
- package/dist/production/src/commands/deploy/DeployCommand.js +5 -5
- package/dist/production/src/commands/deploy/DeployCommand.js.map +1 -1
- package/dist/production/src/lib/admin/AdminClient.cjs +1 -1
- package/dist/production/src/lib/admin/AdminClient.cjs.map +1 -1
- package/dist/production/src/lib/admin/AdminClient.js +1 -1
- package/dist/production/src/lib/admin/AdminClient.js.map +1 -1
- package/dist/production/src/lib/project/RemoteProjectResolver.cjs +6 -2
- package/dist/production/src/lib/project/RemoteProjectResolver.cjs.map +1 -1
- package/dist/production/src/lib/project/RemoteProjectResolver.js +6 -2
- package/dist/production/src/lib/project/RemoteProjectResolver.js.map +1 -1
- package/dist/production/src/lib/project/docs/projectDescribe.cjs +2 -4
- package/dist/production/src/lib/project/docs/projectDescribe.cjs.map +1 -1
- package/dist/production/src/lib/project/docs/projectDescribe.js +2 -3
- package/dist/production/src/lib/project/docs/projectDescribe.js.map +1 -1
- package/dist/types/commands/deploy/DeployCommand.d.ts.map +1 -1
- package/dist/types/lib/project/RemoteProjectResolver.d.ts +1 -1
- package/dist/types/lib/project/RemoteProjectResolver.d.ts.map +1 -1
- package/dist/types/lib/project/docs/projectDescribe.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
- package/src/commands/deploy/DeployCommand.ts +6 -5
- package/src/lib/admin/AdminClient.ts +1 -1
- package/src/lib/project/RemoteProjectResolver.ts +7 -2
- package/src/lib/project/docs/projectDescribe.tsx +2 -3
package/Dockerfile
CHANGED
|
@@ -13,7 +13,7 @@ WORKDIR /src
|
|
|
13
13
|
ENV NODE_ENV "production"
|
|
14
14
|
|
|
15
15
|
COPY --from=builder /src/dist/ /opt/contember/
|
|
16
|
-
COPY --from=builder /src/packages/cli/dist/
|
|
16
|
+
COPY --from=builder /src/packages/cli/dist/resources/ /opt/contember/dist/resources/
|
|
17
17
|
COPY --from=builder /src/packages/cli/package.json /opt/contember/package.json
|
|
18
18
|
RUN ln -s /opt/contember/run.js /usr/bin/contember
|
|
19
19
|
ENV CONTEMBER_CLI_PACKAGE_ROOT /opt/contember
|
|
@@ -24,21 +24,21 @@ class DeployCommand extends cliCommon.Command {
|
|
|
24
24
|
}
|
|
25
25
|
async execute(input) {
|
|
26
26
|
const dsn = input.getArgument("dsn");
|
|
27
|
-
const
|
|
27
|
+
const adminEndpoint = input.getOption("admin");
|
|
28
|
+
const remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint);
|
|
28
29
|
if (!remoteProject) {
|
|
29
30
|
throw `Project not defined. Please provide DSN or environment variables CONTEMBER_*`;
|
|
30
31
|
}
|
|
31
32
|
this.remoteProjectProvider.setRemoteProject(remoteProject);
|
|
32
|
-
let adminEndpoint = input.getOption("admin");
|
|
33
33
|
const deployMigration = input.getOption("no-migrations") !== true;
|
|
34
34
|
const yes = input.getOption("yes") === true;
|
|
35
35
|
const projectAdminDistDir = this.workspace.adminDistDir;
|
|
36
|
-
const deployAdmin = input.getOption("no-admin") !== true && !!adminEndpoint && !!projectAdminDistDir;
|
|
36
|
+
const deployAdmin = input.getOption("no-admin") !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir;
|
|
37
37
|
console.log("");
|
|
38
38
|
console.log("Contember project deployment configuration:");
|
|
39
39
|
console.log(`Target project name: ${remoteProject.name}`);
|
|
40
40
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
41
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
41
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
42
42
|
console.log(`Deploy token: ${maskToken.maskToken(remoteProject.token)}`);
|
|
43
43
|
console.log("");
|
|
44
44
|
if (deployAdmin && !await this.fs.pathExists(`${projectAdminDistDir}/index.html`)) {
|
|
@@ -79,7 +79,7 @@ class DeployCommand extends cliCommon.Command {
|
|
|
79
79
|
console.log("");
|
|
80
80
|
console.log("Deployment successful");
|
|
81
81
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
82
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
82
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
83
83
|
return 0;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeployCommand.cjs","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\
|
|
1
|
+
{"version":3,"file":"DeployCommand.cjs","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst adminEndpoint = input.getOption('admin')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\tconst deployMigration = input.getOption('no-migrations') !== true\n\t\tconst yes = input.getOption('yes') === true\n\t\tconst projectAdminDistDir = this.workspace.adminDistDir\n\n\t\tconst deployAdmin = input.getOption('no-admin') !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir\n\n\n\t\tconsole.log('')\n\t\tconsole.log('Contember project deployment configuration:')\n\t\tconsole.log(`Target project name: ${remoteProject.name}`)\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\t\tconsole.log(`Deploy token: ${maskToken(remoteProject.token)}`)\n\t\tconsole.log('')\n\n\n\t\tif (deployAdmin && !(await this.fs.pathExists(`${projectAdminDistDir}/index.html`))) {\n\t\t\tthrow `Missing ${projectAdminDistDir}/index.html. Please build admin before deploying.`\n\t\t}\n\n\t\tif (deployMigration) {\n\t\t\tconst result = await this.migrationExecutionFacade.execute({\n\t\t\t\tforce: false,\n\t\t\t\trequireConfirmation: !yes,\n\t\t\t\tadditionalMessage: deployAdmin ? 'Admin will be deployed.' : 'Admin will NOT be deployed.',\n\t\t\t})\n\t\t\tif (!result) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (deployAdmin) {\n\t\t\tif (!deployMigration && !yes) {\n\t\t\t\tif (!process.stdin.isTTY) {\n\t\t\t\t\tthrow 'TTY not available. Pass --yes option to confirm execution.'\n\t\t\t\t}\n\t\t\t\tconsole.log('Admin will be deployed.')\n\t\t\t\tconsole.log('(to skip this dialog, you can pass --yes option)')\n\t\t\t\tconsole.log('')\n\t\t\t\tconst { ok } = await prompts({\n\t\t\t\t\ttype: 'confirm',\n\t\t\t\t\tname: 'ok',\n\t\t\t\t\tmessage: `Do you want to continue?`,\n\t\t\t\t})\n\t\t\t\tif (!ok) {\n\t\t\t\t\treturn 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.adminDeployer.deploy({\n\t\t\t\tdir: projectAdminDistDir,\n\t\t\t\troot: input.getOption('root') === true,\n\t\t\t})\n\t\t}\n\n\t\tconsole.log('')\n\t\tconsole.log('Deployment successful')\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\n\t\treturn 0\n\t}\n}\n"],"names":["Command","maskToken"],"mappings":";;;;;AAuBO,MAAM,sBAAsBA,UAAAA,QAAuB;AAAA,EACzD,YACkB,eACA,0BACA,IACA,uBACA,uBACA,WAChB;AACK;AAPW,SAAA,gBAAA;AACA,SAAA,2BAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,wBAAA;AACA,SAAA,YAAA;AAAA,EAGlB;AAAA,EAEU,UAAU,eAA0D;AAC7E,kBAAc,YAAY,0BAA0B;AACpD,kBAAc,SAAS,KAAK;AAEd,kBAAA,OAAO,OAAO,EAAE,cAAc;AAC9B,kBAAA,OAAO,MAAM,EAAE,UAAU;AACzB,kBAAA,OAAO,UAAU,EAAE,UAAU;AAC7B,kBAAA,OAAO,eAAe,EAAE,UAAU;AAChD,kBACE,OAAO,KAAK,EACZ,UAAU,EACV,YAAY,8BAA8B;AAAA,EAC7C;AAAA,EAEA,MAAgB,QAAQ,OAAqD;AAEtE,UAAA,MAAM,MAAM,YAAY,KAAK;AAC7B,UAAA,gBAAgB,MAAM,UAAU,OAAO;AAC7C,UAAM,gBAAgB,KAAK,sBAAsB,QAAQ,KAAK,aAAa;AAC3E,QAAI,CAAC,eAAe;AACb,YAAA;AAAA,IACP;AACK,SAAA,sBAAsB,iBAAiB,aAAa;AAEzD,UAAM,kBAAkB,MAAM,UAAU,eAAe,MAAM;AAC7D,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM;AACjC,UAAA,sBAAsB,KAAK,UAAU;AAErC,UAAA,cAAc,MAAM,UAAU,UAAU,MAAM,QAAQ,CAAC,CAAC,cAAc,iBAAiB,CAAC,CAAC;AAG/F,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,wBAAwB,cAAc,IAAI,EAAE;AACxD,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AACjE,YAAQ,IAAI,iBAAiBC,UAAAA,UAAU,cAAc,KAAK,CAAC,EAAE;AAC7D,YAAQ,IAAI,EAAE;AAGV,QAAA,eAAe,CAAE,MAAM,KAAK,GAAG,WAAW,GAAG,mBAAmB,aAAa,GAAI;AACpF,YAAM,WAAW,mBAAmB;AAAA,IACrC;AAEA,QAAI,iBAAiB;AACpB,YAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAAA,QAC1D,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,mBAAmB,cAAc,4BAA4B;AAAA,MAAA,CAC7D;AACD,UAAI,CAAC,QAAQ;AACZ;AAAA,MACD;AAAA,IACD;AAEA,QAAI,aAAa;AACZ,UAAA,CAAC,mBAAmB,CAAC,KAAK;AACzB,YAAA,CAAC,QAAQ,MAAM,OAAO;AACnB,gBAAA;AAAA,QACP;AACA,gBAAQ,IAAI,yBAAyB;AACrC,gBAAQ,IAAI,kDAAkD;AAC9D,gBAAQ,IAAI,EAAE;AACd,cAAM,EAAE,OAAO,MAAM,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACT;AACD,YAAI,CAAC,IAAI;AACD,iBAAA;AAAA,QACR;AAAA,MACD;AACM,YAAA,KAAK,cAAc,OAAO;AAAA,QAC/B,KAAK;AAAA,QACL,MAAM,MAAM,UAAU,MAAM,MAAM;AAAA,MAAA,CAClC;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AAE1D,WAAA;AAAA,EACR;AACD;;"}
|
|
@@ -22,21 +22,21 @@ class DeployCommand extends Command {
|
|
|
22
22
|
}
|
|
23
23
|
async execute(input) {
|
|
24
24
|
const dsn = input.getArgument("dsn");
|
|
25
|
-
const
|
|
25
|
+
const adminEndpoint = input.getOption("admin");
|
|
26
|
+
const remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint);
|
|
26
27
|
if (!remoteProject) {
|
|
27
28
|
throw `Project not defined. Please provide DSN or environment variables CONTEMBER_*`;
|
|
28
29
|
}
|
|
29
30
|
this.remoteProjectProvider.setRemoteProject(remoteProject);
|
|
30
|
-
let adminEndpoint = input.getOption("admin");
|
|
31
31
|
const deployMigration = input.getOption("no-migrations") !== true;
|
|
32
32
|
const yes = input.getOption("yes") === true;
|
|
33
33
|
const projectAdminDistDir = this.workspace.adminDistDir;
|
|
34
|
-
const deployAdmin = input.getOption("no-admin") !== true && !!adminEndpoint && !!projectAdminDistDir;
|
|
34
|
+
const deployAdmin = input.getOption("no-admin") !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir;
|
|
35
35
|
console.log("");
|
|
36
36
|
console.log("Contember project deployment configuration:");
|
|
37
37
|
console.log(`Target project name: ${remoteProject.name}`);
|
|
38
38
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
39
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
39
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
40
40
|
console.log(`Deploy token: ${maskToken(remoteProject.token)}`);
|
|
41
41
|
console.log("");
|
|
42
42
|
if (deployAdmin && !await this.fs.pathExists(`${projectAdminDistDir}/index.html`)) {
|
|
@@ -77,7 +77,7 @@ class DeployCommand extends Command {
|
|
|
77
77
|
console.log("");
|
|
78
78
|
console.log("Deployment successful");
|
|
79
79
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
80
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
80
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
81
81
|
return 0;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeployCommand.js","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\
|
|
1
|
+
{"version":3,"file":"DeployCommand.js","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst adminEndpoint = input.getOption('admin')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\tconst deployMigration = input.getOption('no-migrations') !== true\n\t\tconst yes = input.getOption('yes') === true\n\t\tconst projectAdminDistDir = this.workspace.adminDistDir\n\n\t\tconst deployAdmin = input.getOption('no-admin') !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir\n\n\n\t\tconsole.log('')\n\t\tconsole.log('Contember project deployment configuration:')\n\t\tconsole.log(`Target project name: ${remoteProject.name}`)\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\t\tconsole.log(`Deploy token: ${maskToken(remoteProject.token)}`)\n\t\tconsole.log('')\n\n\n\t\tif (deployAdmin && !(await this.fs.pathExists(`${projectAdminDistDir}/index.html`))) {\n\t\t\tthrow `Missing ${projectAdminDistDir}/index.html. Please build admin before deploying.`\n\t\t}\n\n\t\tif (deployMigration) {\n\t\t\tconst result = await this.migrationExecutionFacade.execute({\n\t\t\t\tforce: false,\n\t\t\t\trequireConfirmation: !yes,\n\t\t\t\tadditionalMessage: deployAdmin ? 'Admin will be deployed.' : 'Admin will NOT be deployed.',\n\t\t\t})\n\t\t\tif (!result) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (deployAdmin) {\n\t\t\tif (!deployMigration && !yes) {\n\t\t\t\tif (!process.stdin.isTTY) {\n\t\t\t\t\tthrow 'TTY not available. Pass --yes option to confirm execution.'\n\t\t\t\t}\n\t\t\t\tconsole.log('Admin will be deployed.')\n\t\t\t\tconsole.log('(to skip this dialog, you can pass --yes option)')\n\t\t\t\tconsole.log('')\n\t\t\t\tconst { ok } = await prompts({\n\t\t\t\t\ttype: 'confirm',\n\t\t\t\t\tname: 'ok',\n\t\t\t\t\tmessage: `Do you want to continue?`,\n\t\t\t\t})\n\t\t\t\tif (!ok) {\n\t\t\t\t\treturn 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.adminDeployer.deploy({\n\t\t\t\tdir: projectAdminDistDir,\n\t\t\t\troot: input.getOption('root') === true,\n\t\t\t})\n\t\t}\n\n\t\tconsole.log('')\n\t\tconsole.log('Deployment successful')\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\n\t\treturn 0\n\t}\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,sBAAsB,QAAuB;AAAA,EACzD,YACkB,eACA,0BACA,IACA,uBACA,uBACA,WAChB;AACK;AAPW,SAAA,gBAAA;AACA,SAAA,2BAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,wBAAA;AACA,SAAA,YAAA;AAAA,EAGlB;AAAA,EAEU,UAAU,eAA0D;AAC7E,kBAAc,YAAY,0BAA0B;AACpD,kBAAc,SAAS,KAAK;AAEd,kBAAA,OAAO,OAAO,EAAE,cAAc;AAC9B,kBAAA,OAAO,MAAM,EAAE,UAAU;AACzB,kBAAA,OAAO,UAAU,EAAE,UAAU;AAC7B,kBAAA,OAAO,eAAe,EAAE,UAAU;AAChD,kBACE,OAAO,KAAK,EACZ,UAAU,EACV,YAAY,8BAA8B;AAAA,EAC7C;AAAA,EAEA,MAAgB,QAAQ,OAAqD;AAEtE,UAAA,MAAM,MAAM,YAAY,KAAK;AAC7B,UAAA,gBAAgB,MAAM,UAAU,OAAO;AAC7C,UAAM,gBAAgB,KAAK,sBAAsB,QAAQ,KAAK,aAAa;AAC3E,QAAI,CAAC,eAAe;AACb,YAAA;AAAA,IACP;AACK,SAAA,sBAAsB,iBAAiB,aAAa;AAEzD,UAAM,kBAAkB,MAAM,UAAU,eAAe,MAAM;AAC7D,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM;AACjC,UAAA,sBAAsB,KAAK,UAAU;AAErC,UAAA,cAAc,MAAM,UAAU,UAAU,MAAM,QAAQ,CAAC,CAAC,cAAc,iBAAiB,CAAC,CAAC;AAG/F,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,wBAAwB,cAAc,IAAI,EAAE;AACxD,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AACjE,YAAQ,IAAI,iBAAiB,UAAU,cAAc,KAAK,CAAC,EAAE;AAC7D,YAAQ,IAAI,EAAE;AAGV,QAAA,eAAe,CAAE,MAAM,KAAK,GAAG,WAAW,GAAG,mBAAmB,aAAa,GAAI;AACpF,YAAM,WAAW,mBAAmB;AAAA,IACrC;AAEA,QAAI,iBAAiB;AACpB,YAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAAA,QAC1D,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,mBAAmB,cAAc,4BAA4B;AAAA,MAAA,CAC7D;AACD,UAAI,CAAC,QAAQ;AACZ;AAAA,MACD;AAAA,IACD;AAEA,QAAI,aAAa;AACZ,UAAA,CAAC,mBAAmB,CAAC,KAAK;AACzB,YAAA,CAAC,QAAQ,MAAM,OAAO;AACnB,gBAAA;AAAA,QACP;AACA,gBAAQ,IAAI,yBAAyB;AACrC,gBAAQ,IAAI,kDAAkD;AAC9D,gBAAQ,IAAI,EAAE;AACd,cAAM,EAAE,OAAO,MAAM,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACT;AACD,YAAI,CAAC,IAAI;AACD,iBAAA;AAAA,QACR;AAAA,MACD;AACM,YAAA,KAAK,cAAc,OAAO;AAAA,QAC/B,KAAK;AAAA,QACL,MAAM,MAAM,UAAU,MAAM,MAAM;AAAA,MAAA,CAClC;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AAE1D,WAAA;AAAA,EACR;AACD;"}
|
|
@@ -10,7 +10,7 @@ class AdminClient {
|
|
|
10
10
|
if (!response.ok) {
|
|
11
11
|
const project2 = this.remoteProjectProvider.get();
|
|
12
12
|
const maskedToken = maskToken.maskToken(project2.token);
|
|
13
|
-
throw `Failed to deploy admin, POST request to ${project2.
|
|
13
|
+
throw `Failed to deploy admin, POST request to ${project2.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}
|
|
14
14
|
${await response.text()}`;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminClient.cjs","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.
|
|
1
|
+
{"version":3,"file":"AdminClient.cjs","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}\\n${await response.text()}`\n\t\t}\n\t}\n\n\tprivate async execute(path: string, method: string, body: any): Promise<Response> {\n\t\tconst project = this.remoteProjectProvider.get()\n\t\tif (!project.adminEndpoint) {\n\t\t\tthrow new Error('Admin endpoint not set')\n\t\t}\n\t\treturn await fetch(`${project.adminEndpoint}/${path}`, {\n\t\t\tmethod: method,\n\t\t\theaders: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${project.token}` },\n\t\t\tbody: JSON.stringify(body),\n\t\t})\n\t}\n\n}\n"],"names":["project","maskToken"],"mappings":";;;AAIO,MAAM,YAAY;AAAA,EACxB,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,OAAO,SAAwB,OAAkC;AACvE,UAAA,WAAW,MAAM,KAAK,QAAQ,WAAW,QAAQ,EAAE,SAAS,MAAA,CAAO;AAErE,QAAA,CAAC,SAAS,IAAI;AACXA,YAAAA,WAAU,KAAK,sBAAsB,IAAI;AACzC,YAAA,cAAcC,UAAAA,UAAUD,SAAQ,KAAK;AACrC,YAAA,2CAA2CA,SAAQ,aAAa,uBAAuB,WAAW,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,EAAK,MAAM,SAAS,KAAM,CAAA;AAAA,IAC7L;AAAA,EACD;AAAA,EAEA,MAAc,QAAQ,MAAc,QAAgB,MAA8B;AAC3E,UAAA,UAAU,KAAK,sBAAsB,IAAI;AAC3C,QAAA,CAAC,QAAQ,eAAe;AACrB,YAAA,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM,MAAM,GAAG,QAAQ,aAAa,IAAI,IAAI,IAAI;AAAA,MACtD;AAAA,MACA,SAAS,EAAE,gBAAgB,oBAAoB,iBAAiB,UAAU,QAAQ,KAAK,GAAG;AAAA,MAC1F,MAAM,KAAK,UAAU,IAAI;AAAA,IAAA,CACzB;AAAA,EACF;AAED;;"}
|
|
@@ -8,7 +8,7 @@ class AdminClient {
|
|
|
8
8
|
if (!response.ok) {
|
|
9
9
|
const project2 = this.remoteProjectProvider.get();
|
|
10
10
|
const maskedToken = maskToken(project2.token);
|
|
11
|
-
throw `Failed to deploy admin, POST request to ${project2.
|
|
11
|
+
throw `Failed to deploy admin, POST request to ${project2.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}
|
|
12
12
|
${await response.text()}`;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminClient.js","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.
|
|
1
|
+
{"version":3,"file":"AdminClient.js","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}\\n${await response.text()}`\n\t\t}\n\t}\n\n\tprivate async execute(path: string, method: string, body: any): Promise<Response> {\n\t\tconst project = this.remoteProjectProvider.get()\n\t\tif (!project.adminEndpoint) {\n\t\t\tthrow new Error('Admin endpoint not set')\n\t\t}\n\t\treturn await fetch(`${project.adminEndpoint}/${path}`, {\n\t\t\tmethod: method,\n\t\t\theaders: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${project.token}` },\n\t\t\tbody: JSON.stringify(body),\n\t\t})\n\t}\n\n}\n"],"names":["project"],"mappings":";AAIO,MAAM,YAAY;AAAA,EACxB,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,OAAO,SAAwB,OAAkC;AACvE,UAAA,WAAW,MAAM,KAAK,QAAQ,WAAW,QAAQ,EAAE,SAAS,MAAA,CAAO;AAErE,QAAA,CAAC,SAAS,IAAI;AACXA,YAAAA,WAAU,KAAK,sBAAsB,IAAI;AACzC,YAAA,cAAc,UAAUA,SAAQ,KAAK;AACrC,YAAA,2CAA2CA,SAAQ,aAAa,uBAAuB,WAAW,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,EAAK,MAAM,SAAS,KAAM,CAAA;AAAA,IAC7L;AAAA,EACD;AAAA,EAEA,MAAc,QAAQ,MAAc,QAAgB,MAA8B;AAC3E,UAAA,UAAU,KAAK,sBAAsB,IAAI;AAC3C,QAAA,CAAC,QAAQ,eAAe;AACrB,YAAA,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM,MAAM,GAAG,QAAQ,aAAa,IAAI,IAAI,IAAI;AAAA,MACtD;AAAA,MACA,SAAS,EAAE,gBAAgB,oBAAoB,iBAAiB,UAAU,QAAQ,KAAK,GAAG;AAAA,MAC1F,MAAM,KAAK,UAAU,IAAI;AAAA,IAAA,CACzB;AAAA,EACF;AAED;"}
|
|
@@ -6,7 +6,7 @@ class RemoteProjectResolver {
|
|
|
6
6
|
constructor(cliEnv) {
|
|
7
7
|
this.cliEnv = cliEnv;
|
|
8
8
|
}
|
|
9
|
-
resolve(identifier) {
|
|
9
|
+
resolve(identifier, adminEndpoint) {
|
|
10
10
|
let endpoint;
|
|
11
11
|
let token;
|
|
12
12
|
let project;
|
|
@@ -22,7 +22,11 @@ class RemoteProjectResolver {
|
|
|
22
22
|
if (!project || !endpoint || !token) {
|
|
23
23
|
return void 0;
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
if (!adminEndpoint && (endpoint.endsWith(".contember.cloud") || !endpoint.includes("://api-"))) {
|
|
26
|
+
adminEndpoint = endpoint;
|
|
27
|
+
endpoint += "/_api";
|
|
28
|
+
}
|
|
29
|
+
return new RemoteProject.RemoteProject(project, endpoint, token, adminEndpoint);
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
32
|
exports.RemoteProjectResolver = RemoteProjectResolver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteProjectResolver.cjs","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token)\n\t}\n}\n"],"names":["parseDsn","RemoteProject"],"mappings":";;;;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,
|
|
1
|
+
{"version":3,"file":"RemoteProjectResolver.cjs","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string, adminEndpoint?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (!adminEndpoint && (endpoint.endsWith('.contember.cloud') || !endpoint.includes('://api-'))) {\n\t\t\tadminEndpoint = endpoint\n\t\t\tendpoint += '/_api'\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token, adminEndpoint)\n\t}\n}\n"],"names":["parseDsn","RemoteProject"],"mappings":";;;;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,YAAqB,eAAmD;AAC3E,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA,YAAY,SAAS,KAAK,GAAG;AAChC,OAAC,EAAE,UAAU,SAAS,MAAM,IAAIA,IAAAA,SAAS,UAAU;AAAA,IAAA,WACzC,KAAK,OAAO,KAAK;AAC1B,OAAA,EAAE,UAAU,SAAS,MAAA,IAAUA,IAAAA,SAAS,KAAK,OAAO,GAAG;AAAA,IAAA,OAClD;AACN,iBAAW,KAAK,OAAO;AACvB,cAAQ,KAAK,OAAO;AACpB,gBAAU,CAAC,cAAc,eAAe,MAAM,KAAK,OAAO,cAAc;AAAA,IACzE;AACA,QAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO;AAC7B,aAAA;AAAA,IACR;AAEI,QAAA,CAAC,kBAAkB,SAAS,SAAS,kBAAkB,KAAK,CAAC,SAAS,SAAS,SAAS,IAAI;AAC/E,sBAAA;AACJ,kBAAA;AAAA,IACb;AAEA,WAAO,IAAIC,cAAA,cAAc,SAAS,UAAU,OAAO,aAAa;AAAA,EACjE;AACD;;"}
|
|
@@ -4,7 +4,7 @@ class RemoteProjectResolver {
|
|
|
4
4
|
constructor(cliEnv) {
|
|
5
5
|
this.cliEnv = cliEnv;
|
|
6
6
|
}
|
|
7
|
-
resolve(identifier) {
|
|
7
|
+
resolve(identifier, adminEndpoint) {
|
|
8
8
|
let endpoint;
|
|
9
9
|
let token;
|
|
10
10
|
let project;
|
|
@@ -20,7 +20,11 @@ class RemoteProjectResolver {
|
|
|
20
20
|
if (!project || !endpoint || !token) {
|
|
21
21
|
return void 0;
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
if (!adminEndpoint && (endpoint.endsWith(".contember.cloud") || !endpoint.includes("://api-"))) {
|
|
24
|
+
adminEndpoint = endpoint;
|
|
25
|
+
endpoint += "/_api";
|
|
26
|
+
}
|
|
27
|
+
return new RemoteProject(project, endpoint, token, adminEndpoint);
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteProjectResolver.js","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token)\n\t}\n}\n"],"names":[],"mappings":";;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,
|
|
1
|
+
{"version":3,"file":"RemoteProjectResolver.js","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string, adminEndpoint?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (!adminEndpoint && (endpoint.endsWith('.contember.cloud') || !endpoint.includes('://api-'))) {\n\t\t\tadminEndpoint = endpoint\n\t\t\tendpoint += '/_api'\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token, adminEndpoint)\n\t}\n}\n"],"names":[],"mappings":";;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,YAAqB,eAAmD;AAC3E,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA,YAAY,SAAS,KAAK,GAAG;AAChC,OAAC,EAAE,UAAU,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAAA,WACzC,KAAK,OAAO,KAAK;AAC1B,OAAA,EAAE,UAAU,SAAS,MAAA,IAAU,SAAS,KAAK,OAAO,GAAG;AAAA,IAAA,OAClD;AACN,iBAAW,KAAK,OAAO;AACvB,cAAQ,KAAK,OAAO;AACpB,gBAAU,CAAC,cAAc,eAAe,MAAM,KAAK,OAAO,cAAc;AAAA,IACzE;AACA,QAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO;AAC7B,aAAA;AAAA,IACR;AAEI,QAAA,CAAC,kBAAkB,SAAS,SAAS,kBAAkB,KAAK,CAAC,SAAS,SAAS,SAAS,IAAI;AAC/E,sBAAA;AACJ,kBAAA;AAAA,IACb;AAEA,WAAO,IAAI,cAAc,SAAS,UAAU,OAAO,aAAa;AAAA,EACjE;AACD;"}
|
|
@@ -4,16 +4,14 @@ const jsxDevRuntime = require("react/jsx-dev-runtime");
|
|
|
4
4
|
const render = require("preact-render-to-string");
|
|
5
5
|
const ProjectInfo = require("./components/ProjectInfo.cjs");
|
|
6
6
|
const fs = require("node:fs/promises");
|
|
7
|
-
const
|
|
8
|
-
const node_url = require("node:url");
|
|
9
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
|
+
const consts = require("../../../consts.cjs");
|
|
10
8
|
const renderProjectInfoHtml = async (schema, projectName) => {
|
|
11
9
|
const html = render(/* @__PURE__ */ jsxDevRuntime.jsxDEV(ProjectInfo.ProjectInfo, { schema, projectName }, void 0, false, {
|
|
12
10
|
fileName: "/home/runner/work/contember/contember/packages/cli/src/lib/project/docs/projectDescribe.tsx",
|
|
13
|
-
lineNumber:
|
|
11
|
+
lineNumber: 9,
|
|
14
12
|
columnNumber: 22
|
|
15
13
|
}, void 0));
|
|
16
|
-
const css = await fs.readFile(
|
|
14
|
+
const css = await fs.readFile(consts.packageRoot + "/dist/resources/out.css");
|
|
17
15
|
return `<!DOCTYPE html>
|
|
18
16
|
<html lang="en">
|
|
19
17
|
<head>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectDescribe.cjs","sources":["../../../../../../../packages/cli/src/lib/project/docs/projectDescribe.tsx"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { h } from 'preact'\nimport render from 'preact-render-to-string'\nimport { ProjectInfo } from './components/ProjectInfo'\nimport { readFile } from 'node:fs/promises'\nimport {
|
|
1
|
+
{"version":3,"file":"projectDescribe.cjs","sources":["../../../../../../../packages/cli/src/lib/project/docs/projectDescribe.tsx"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { h } from 'preact'\nimport render from 'preact-render-to-string'\nimport { ProjectInfo } from './components/ProjectInfo'\nimport { readFile } from 'node:fs/promises'\nimport { packageRoot } from '../../../consts'\n\nexport const renderProjectInfoHtml = async (schema: Schema, projectName: string) => {\n\tconst html = render(<ProjectInfo schema={schema} projectName={projectName} />)\n\n\tconst css = await readFile(packageRoot + '/dist/resources/out.css')\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<style>${css}</style>\n\t<title>${projectName}</title>\n</head>\n<body>\n${html}\n</body>\n</html>\n`\n\n}\n\n"],"names":["jsxDEV","ProjectInfo","this","readFile","packageRoot"],"mappings":";;;;;;;AAOa,MAAA,wBAAwB,OAAO,QAAgB,gBAAwB;AACnF,QAAM,OAAO,OAAQA,8BAAAA,OAAAC,YAAA,aAAA,EAAY,QAAgB,YAA7B,GAAA,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAAA,GAAAC,MAAuD,CAAE;AAE7E,QAAM,MAAM,MAAMC,GAAAA,SAASC,OAAA,cAAc,yBAAyB;AAC3D,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKE,GAAG;AAAA,UACH,WAAW;AAAA;AAAA;AAAA,EAGnB,IAAI;AAAA;AAAA;AAAA;AAKN;;"}
|
|
@@ -2,15 +2,14 @@ import { jsxDEV } from "react/jsx-dev-runtime";
|
|
|
2
2
|
import render from "preact-render-to-string";
|
|
3
3
|
import { ProjectInfo } from "./components/ProjectInfo.js";
|
|
4
4
|
import { readFile } from "node:fs/promises";
|
|
5
|
-
import {
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { packageRoot } from "../../../consts.js";
|
|
7
6
|
const renderProjectInfoHtml = async (schema, projectName) => {
|
|
8
7
|
const html = render(/* @__PURE__ */ jsxDEV(ProjectInfo, { schema, projectName }, void 0, false, {
|
|
9
8
|
fileName: "/home/runner/work/contember/contember/packages/cli/src/lib/project/docs/projectDescribe.tsx",
|
|
10
|
-
lineNumber:
|
|
9
|
+
lineNumber: 9,
|
|
11
10
|
columnNumber: 22
|
|
12
11
|
}, void 0));
|
|
13
|
-
const css = await readFile(
|
|
12
|
+
const css = await readFile(packageRoot + "/dist/resources/out.css");
|
|
14
13
|
return `<!DOCTYPE html>
|
|
15
14
|
<html lang="en">
|
|
16
15
|
<head>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectDescribe.js","sources":["../../../../../../../packages/cli/src/lib/project/docs/projectDescribe.tsx"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { h } from 'preact'\nimport render from 'preact-render-to-string'\nimport { ProjectInfo } from './components/ProjectInfo'\nimport { readFile } from 'node:fs/promises'\nimport {
|
|
1
|
+
{"version":3,"file":"projectDescribe.js","sources":["../../../../../../../packages/cli/src/lib/project/docs/projectDescribe.tsx"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { h } from 'preact'\nimport render from 'preact-render-to-string'\nimport { ProjectInfo } from './components/ProjectInfo'\nimport { readFile } from 'node:fs/promises'\nimport { packageRoot } from '../../../consts'\n\nexport const renderProjectInfoHtml = async (schema: Schema, projectName: string) => {\n\tconst html = render(<ProjectInfo schema={schema} projectName={projectName} />)\n\n\tconst css = await readFile(packageRoot + '/dist/resources/out.css')\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<style>${css}</style>\n\t<title>${projectName}</title>\n</head>\n<body>\n${html}\n</body>\n</html>\n`\n\n}\n\n"],"names":["this"],"mappings":";;;;;AAOa,MAAA,wBAAwB,OAAO,QAAgB,gBAAwB;AACnF,QAAM,OAAO,OAAQ,uBAAA,aAAA,EAAY,QAAgB,YAA7B,GAAA,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAAA,GAAAA,MAAuD,CAAE;AAE7E,QAAM,MAAM,MAAM,SAAS,cAAc,yBAAyB;AAC3D,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKE,GAAG;AAAA,UACH,WAAW;AAAA;AAAA;AAAA,EAGnB,IAAI;AAAA;AAAA;AAAA;AAKN;"}
|
|
@@ -24,21 +24,21 @@ class DeployCommand extends cliCommon.Command {
|
|
|
24
24
|
}
|
|
25
25
|
async execute(input) {
|
|
26
26
|
const dsn = input.getArgument("dsn");
|
|
27
|
-
const
|
|
27
|
+
const adminEndpoint = input.getOption("admin");
|
|
28
|
+
const remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint);
|
|
28
29
|
if (!remoteProject) {
|
|
29
30
|
throw `Project not defined. Please provide DSN or environment variables CONTEMBER_*`;
|
|
30
31
|
}
|
|
31
32
|
this.remoteProjectProvider.setRemoteProject(remoteProject);
|
|
32
|
-
let adminEndpoint = input.getOption("admin");
|
|
33
33
|
const deployMigration = input.getOption("no-migrations") !== true;
|
|
34
34
|
const yes = input.getOption("yes") === true;
|
|
35
35
|
const projectAdminDistDir = this.workspace.adminDistDir;
|
|
36
|
-
const deployAdmin = input.getOption("no-admin") !== true && !!adminEndpoint && !!projectAdminDistDir;
|
|
36
|
+
const deployAdmin = input.getOption("no-admin") !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir;
|
|
37
37
|
console.log("");
|
|
38
38
|
console.log("Contember project deployment configuration:");
|
|
39
39
|
console.log(`Target project name: ${remoteProject.name}`);
|
|
40
40
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
41
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
41
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
42
42
|
console.log(`Deploy token: ${maskToken.maskToken(remoteProject.token)}`);
|
|
43
43
|
console.log("");
|
|
44
44
|
if (deployAdmin && !await this.fs.pathExists(`${projectAdminDistDir}/index.html`)) {
|
|
@@ -79,7 +79,7 @@ class DeployCommand extends cliCommon.Command {
|
|
|
79
79
|
console.log("");
|
|
80
80
|
console.log("Deployment successful");
|
|
81
81
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
82
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
82
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
83
83
|
return 0;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeployCommand.cjs","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\
|
|
1
|
+
{"version":3,"file":"DeployCommand.cjs","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst adminEndpoint = input.getOption('admin')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\tconst deployMigration = input.getOption('no-migrations') !== true\n\t\tconst yes = input.getOption('yes') === true\n\t\tconst projectAdminDistDir = this.workspace.adminDistDir\n\n\t\tconst deployAdmin = input.getOption('no-admin') !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir\n\n\n\t\tconsole.log('')\n\t\tconsole.log('Contember project deployment configuration:')\n\t\tconsole.log(`Target project name: ${remoteProject.name}`)\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\t\tconsole.log(`Deploy token: ${maskToken(remoteProject.token)}`)\n\t\tconsole.log('')\n\n\n\t\tif (deployAdmin && !(await this.fs.pathExists(`${projectAdminDistDir}/index.html`))) {\n\t\t\tthrow `Missing ${projectAdminDistDir}/index.html. Please build admin before deploying.`\n\t\t}\n\n\t\tif (deployMigration) {\n\t\t\tconst result = await this.migrationExecutionFacade.execute({\n\t\t\t\tforce: false,\n\t\t\t\trequireConfirmation: !yes,\n\t\t\t\tadditionalMessage: deployAdmin ? 'Admin will be deployed.' : 'Admin will NOT be deployed.',\n\t\t\t})\n\t\t\tif (!result) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (deployAdmin) {\n\t\t\tif (!deployMigration && !yes) {\n\t\t\t\tif (!process.stdin.isTTY) {\n\t\t\t\t\tthrow 'TTY not available. Pass --yes option to confirm execution.'\n\t\t\t\t}\n\t\t\t\tconsole.log('Admin will be deployed.')\n\t\t\t\tconsole.log('(to skip this dialog, you can pass --yes option)')\n\t\t\t\tconsole.log('')\n\t\t\t\tconst { ok } = await prompts({\n\t\t\t\t\ttype: 'confirm',\n\t\t\t\t\tname: 'ok',\n\t\t\t\t\tmessage: `Do you want to continue?`,\n\t\t\t\t})\n\t\t\t\tif (!ok) {\n\t\t\t\t\treturn 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.adminDeployer.deploy({\n\t\t\t\tdir: projectAdminDistDir,\n\t\t\t\troot: input.getOption('root') === true,\n\t\t\t})\n\t\t}\n\n\t\tconsole.log('')\n\t\tconsole.log('Deployment successful')\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\n\t\treturn 0\n\t}\n}\n"],"names":["Command","maskToken"],"mappings":";;;;;AAuBO,MAAM,sBAAsBA,UAAAA,QAAuB;AAAA,EACzD,YACkB,eACA,0BACA,IACA,uBACA,uBACA,WAChB;AACK;AAPW,SAAA,gBAAA;AACA,SAAA,2BAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,wBAAA;AACA,SAAA,YAAA;AAAA,EAGlB;AAAA,EAEU,UAAU,eAA0D;AAC7E,kBAAc,YAAY,0BAA0B;AACpD,kBAAc,SAAS,KAAK;AAEd,kBAAA,OAAO,OAAO,EAAE,cAAc;AAC9B,kBAAA,OAAO,MAAM,EAAE,UAAU;AACzB,kBAAA,OAAO,UAAU,EAAE,UAAU;AAC7B,kBAAA,OAAO,eAAe,EAAE,UAAU;AAChD,kBACE,OAAO,KAAK,EACZ,UAAU,EACV,YAAY,8BAA8B;AAAA,EAC7C;AAAA,EAEA,MAAgB,QAAQ,OAAqD;AAEtE,UAAA,MAAM,MAAM,YAAY,KAAK;AAC7B,UAAA,gBAAgB,MAAM,UAAU,OAAO;AAC7C,UAAM,gBAAgB,KAAK,sBAAsB,QAAQ,KAAK,aAAa;AAC3E,QAAI,CAAC,eAAe;AACb,YAAA;AAAA,IACP;AACK,SAAA,sBAAsB,iBAAiB,aAAa;AAEzD,UAAM,kBAAkB,MAAM,UAAU,eAAe,MAAM;AAC7D,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM;AACjC,UAAA,sBAAsB,KAAK,UAAU;AAErC,UAAA,cAAc,MAAM,UAAU,UAAU,MAAM,QAAQ,CAAC,CAAC,cAAc,iBAAiB,CAAC,CAAC;AAG/F,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,wBAAwB,cAAc,IAAI,EAAE;AACxD,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AACjE,YAAQ,IAAI,iBAAiBC,UAAAA,UAAU,cAAc,KAAK,CAAC,EAAE;AAC7D,YAAQ,IAAI,EAAE;AAGV,QAAA,eAAe,CAAE,MAAM,KAAK,GAAG,WAAW,GAAG,mBAAmB,aAAa,GAAI;AACpF,YAAM,WAAW,mBAAmB;AAAA,IACrC;AAEA,QAAI,iBAAiB;AACpB,YAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAAA,QAC1D,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,mBAAmB,cAAc,4BAA4B;AAAA,MAAA,CAC7D;AACD,UAAI,CAAC,QAAQ;AACZ;AAAA,MACD;AAAA,IACD;AAEA,QAAI,aAAa;AACZ,UAAA,CAAC,mBAAmB,CAAC,KAAK;AACzB,YAAA,CAAC,QAAQ,MAAM,OAAO;AACnB,gBAAA;AAAA,QACP;AACA,gBAAQ,IAAI,yBAAyB;AACrC,gBAAQ,IAAI,kDAAkD;AAC9D,gBAAQ,IAAI,EAAE;AACd,cAAM,EAAE,OAAO,MAAM,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACT;AACD,YAAI,CAAC,IAAI;AACD,iBAAA;AAAA,QACR;AAAA,MACD;AACM,YAAA,KAAK,cAAc,OAAO;AAAA,QAC/B,KAAK;AAAA,QACL,MAAM,MAAM,UAAU,MAAM,MAAM;AAAA,MAAA,CAClC;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AAE1D,WAAA;AAAA,EACR;AACD;;"}
|
|
@@ -22,21 +22,21 @@ class DeployCommand extends Command {
|
|
|
22
22
|
}
|
|
23
23
|
async execute(input) {
|
|
24
24
|
const dsn = input.getArgument("dsn");
|
|
25
|
-
const
|
|
25
|
+
const adminEndpoint = input.getOption("admin");
|
|
26
|
+
const remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint);
|
|
26
27
|
if (!remoteProject) {
|
|
27
28
|
throw `Project not defined. Please provide DSN or environment variables CONTEMBER_*`;
|
|
28
29
|
}
|
|
29
30
|
this.remoteProjectProvider.setRemoteProject(remoteProject);
|
|
30
|
-
let adminEndpoint = input.getOption("admin");
|
|
31
31
|
const deployMigration = input.getOption("no-migrations") !== true;
|
|
32
32
|
const yes = input.getOption("yes") === true;
|
|
33
33
|
const projectAdminDistDir = this.workspace.adminDistDir;
|
|
34
|
-
const deployAdmin = input.getOption("no-admin") !== true && !!adminEndpoint && !!projectAdminDistDir;
|
|
34
|
+
const deployAdmin = input.getOption("no-admin") !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir;
|
|
35
35
|
console.log("");
|
|
36
36
|
console.log("Contember project deployment configuration:");
|
|
37
37
|
console.log(`Target project name: ${remoteProject.name}`);
|
|
38
38
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
39
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
39
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
40
40
|
console.log(`Deploy token: ${maskToken(remoteProject.token)}`);
|
|
41
41
|
console.log("");
|
|
42
42
|
if (deployAdmin && !await this.fs.pathExists(`${projectAdminDistDir}/index.html`)) {
|
|
@@ -77,7 +77,7 @@ class DeployCommand extends Command {
|
|
|
77
77
|
console.log("");
|
|
78
78
|
console.log("Deployment successful");
|
|
79
79
|
console.log(`API URL: ${remoteProject.endpoint}`);
|
|
80
|
-
console.log(`Admin URL: ${adminEndpoint ?? "none"}`);
|
|
80
|
+
console.log(`Admin URL: ${remoteProject.adminEndpoint ?? "none"}`);
|
|
81
81
|
return 0;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeployCommand.js","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\
|
|
1
|
+
{"version":3,"file":"DeployCommand.js","sources":["../../../../../../packages/cli/src/commands/deploy/DeployCommand.ts"],"sourcesContent":["import { Command, CommandConfiguration, Input } from '@contember/cli-common'\nimport prompts from 'prompts'\nimport { maskToken } from '../../lib/maskToken'\nimport { MigrationExecutionFacade } from '../../lib/migrations/MigrationExecutionFacade'\nimport { AdminDeployer } from '../../lib/admin/AdminDeployer'\nimport { FileSystem } from '../../lib/fs/FileSystem'\nimport { RemoteProject } from '../../lib/project/RemoteProject'\nimport { Workspace } from '../../lib/workspace/Workspace'\nimport { RemoteProjectProvider } from '../../lib/project/RemoteProjectProvider'\nimport { RemoteProjectResolver } from '../../lib/project/RemoteProjectResolver'\n\ntype Args = {\n\tdsn: string\n}\n\ntype Options = {\n\tadmin?: string\n\t['no-admin']?: boolean\n\t['no-migrations']?: boolean\n\troot?: boolean\n\tyes?: boolean\n}\n\nexport class DeployCommand extends Command<Args, Options> {\n\tconstructor(\n\t\tprivate readonly adminDeployer: AdminDeployer,\n\t\tprivate readonly migrationExecutionFacade: MigrationExecutionFacade,\n\t\tprivate readonly fs: FileSystem,\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t\tprivate readonly remoteProjectResolver: RemoteProjectResolver,\n\t\tprivate readonly workspace: Workspace,\n\t) {\n\t\tsuper()\n\t}\n\n\tprotected configure(configuration: CommandConfiguration<Args, Options>): void {\n\t\tconfiguration.description('Deploy Contember project')\n\t\tconfiguration.argument('dsn')\n\n\t\tconfiguration.option('admin').valueRequired()\n\t\tconfiguration.option('root').valueNone()\n\t\tconfiguration.option('no-admin').valueNone()\n\t\tconfiguration.option('no-migrations').valueNone()\n\t\tconfiguration //\n\t\t\t.option('yes')\n\t\t\t.valueNone()\n\t\t\t.description('Do not ask for confirmation.')\n\t}\n\n\tprotected async execute(input: Input<Args, Options>): Promise<void | number> {\n\n\t\tconst dsn = input.getArgument('dsn')\n\t\tconst adminEndpoint = input.getOption('admin')\n\t\tconst remoteProject = this.remoteProjectResolver.resolve(dsn, adminEndpoint)\n\t\tif (!remoteProject) {\n\t\t\tthrow `Project not defined. Please provide DSN or environment variables CONTEMBER_*`\n\t\t}\n\t\tthis.remoteProjectProvider.setRemoteProject(remoteProject)\n\n\t\tconst deployMigration = input.getOption('no-migrations') !== true\n\t\tconst yes = input.getOption('yes') === true\n\t\tconst projectAdminDistDir = this.workspace.adminDistDir\n\n\t\tconst deployAdmin = input.getOption('no-admin') !== true && !!remoteProject.adminEndpoint && !!projectAdminDistDir\n\n\n\t\tconsole.log('')\n\t\tconsole.log('Contember project deployment configuration:')\n\t\tconsole.log(`Target project name: ${remoteProject.name}`)\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\t\tconsole.log(`Deploy token: ${maskToken(remoteProject.token)}`)\n\t\tconsole.log('')\n\n\n\t\tif (deployAdmin && !(await this.fs.pathExists(`${projectAdminDistDir}/index.html`))) {\n\t\t\tthrow `Missing ${projectAdminDistDir}/index.html. Please build admin before deploying.`\n\t\t}\n\n\t\tif (deployMigration) {\n\t\t\tconst result = await this.migrationExecutionFacade.execute({\n\t\t\t\tforce: false,\n\t\t\t\trequireConfirmation: !yes,\n\t\t\t\tadditionalMessage: deployAdmin ? 'Admin will be deployed.' : 'Admin will NOT be deployed.',\n\t\t\t})\n\t\t\tif (!result) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (deployAdmin) {\n\t\t\tif (!deployMigration && !yes) {\n\t\t\t\tif (!process.stdin.isTTY) {\n\t\t\t\t\tthrow 'TTY not available. Pass --yes option to confirm execution.'\n\t\t\t\t}\n\t\t\t\tconsole.log('Admin will be deployed.')\n\t\t\t\tconsole.log('(to skip this dialog, you can pass --yes option)')\n\t\t\t\tconsole.log('')\n\t\t\t\tconst { ok } = await prompts({\n\t\t\t\t\ttype: 'confirm',\n\t\t\t\t\tname: 'ok',\n\t\t\t\t\tmessage: `Do you want to continue?`,\n\t\t\t\t})\n\t\t\t\tif (!ok) {\n\t\t\t\t\treturn 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.adminDeployer.deploy({\n\t\t\t\tdir: projectAdminDistDir,\n\t\t\t\troot: input.getOption('root') === true,\n\t\t\t})\n\t\t}\n\n\t\tconsole.log('')\n\t\tconsole.log('Deployment successful')\n\t\tconsole.log(`API URL: ${remoteProject.endpoint}`)\n\t\tconsole.log(`Admin URL: ${remoteProject.adminEndpoint ?? 'none'}`)\n\n\t\treturn 0\n\t}\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,sBAAsB,QAAuB;AAAA,EACzD,YACkB,eACA,0BACA,IACA,uBACA,uBACA,WAChB;AACK;AAPW,SAAA,gBAAA;AACA,SAAA,2BAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,wBAAA;AACA,SAAA,YAAA;AAAA,EAGlB;AAAA,EAEU,UAAU,eAA0D;AAC7E,kBAAc,YAAY,0BAA0B;AACpD,kBAAc,SAAS,KAAK;AAEd,kBAAA,OAAO,OAAO,EAAE,cAAc;AAC9B,kBAAA,OAAO,MAAM,EAAE,UAAU;AACzB,kBAAA,OAAO,UAAU,EAAE,UAAU;AAC7B,kBAAA,OAAO,eAAe,EAAE,UAAU;AAChD,kBACE,OAAO,KAAK,EACZ,UAAU,EACV,YAAY,8BAA8B;AAAA,EAC7C;AAAA,EAEA,MAAgB,QAAQ,OAAqD;AAEtE,UAAA,MAAM,MAAM,YAAY,KAAK;AAC7B,UAAA,gBAAgB,MAAM,UAAU,OAAO;AAC7C,UAAM,gBAAgB,KAAK,sBAAsB,QAAQ,KAAK,aAAa;AAC3E,QAAI,CAAC,eAAe;AACb,YAAA;AAAA,IACP;AACK,SAAA,sBAAsB,iBAAiB,aAAa;AAEzD,UAAM,kBAAkB,MAAM,UAAU,eAAe,MAAM;AAC7D,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM;AACjC,UAAA,sBAAsB,KAAK,UAAU;AAErC,UAAA,cAAc,MAAM,UAAU,UAAU,MAAM,QAAQ,CAAC,CAAC,cAAc,iBAAiB,CAAC,CAAC;AAG/F,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,wBAAwB,cAAc,IAAI,EAAE;AACxD,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AACjE,YAAQ,IAAI,iBAAiB,UAAU,cAAc,KAAK,CAAC,EAAE;AAC7D,YAAQ,IAAI,EAAE;AAGV,QAAA,eAAe,CAAE,MAAM,KAAK,GAAG,WAAW,GAAG,mBAAmB,aAAa,GAAI;AACpF,YAAM,WAAW,mBAAmB;AAAA,IACrC;AAEA,QAAI,iBAAiB;AACpB,YAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAAA,QAC1D,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,mBAAmB,cAAc,4BAA4B;AAAA,MAAA,CAC7D;AACD,UAAI,CAAC,QAAQ;AACZ;AAAA,MACD;AAAA,IACD;AAEA,QAAI,aAAa;AACZ,UAAA,CAAC,mBAAmB,CAAC,KAAK;AACzB,YAAA,CAAC,QAAQ,MAAM,OAAO;AACnB,gBAAA;AAAA,QACP;AACA,gBAAQ,IAAI,yBAAyB;AACrC,gBAAQ,IAAI,kDAAkD;AAC9D,gBAAQ,IAAI,EAAE;AACd,cAAM,EAAE,OAAO,MAAM,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACT;AACD,YAAI,CAAC,IAAI;AACD,iBAAA;AAAA,QACR;AAAA,MACD;AACM,YAAA,KAAK,cAAc,OAAO;AAAA,QAC/B,KAAK;AAAA,QACL,MAAM,MAAM,UAAU,MAAM,MAAM;AAAA,MAAA,CAClC;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,YAAY,cAAc,QAAQ,EAAE;AAChD,YAAQ,IAAI,cAAc,cAAc,iBAAiB,MAAM,EAAE;AAE1D,WAAA;AAAA,EACR;AACD;"}
|
|
@@ -10,7 +10,7 @@ class AdminClient {
|
|
|
10
10
|
if (!response.ok) {
|
|
11
11
|
const project2 = this.remoteProjectProvider.get();
|
|
12
12
|
const maskedToken = maskToken.maskToken(project2.token);
|
|
13
|
-
throw `Failed to deploy admin, POST request to ${project2.
|
|
13
|
+
throw `Failed to deploy admin, POST request to ${project2.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}
|
|
14
14
|
${await response.text()}`;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminClient.cjs","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.
|
|
1
|
+
{"version":3,"file":"AdminClient.cjs","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}\\n${await response.text()}`\n\t\t}\n\t}\n\n\tprivate async execute(path: string, method: string, body: any): Promise<Response> {\n\t\tconst project = this.remoteProjectProvider.get()\n\t\tif (!project.adminEndpoint) {\n\t\t\tthrow new Error('Admin endpoint not set')\n\t\t}\n\t\treturn await fetch(`${project.adminEndpoint}/${path}`, {\n\t\t\tmethod: method,\n\t\t\theaders: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${project.token}` },\n\t\t\tbody: JSON.stringify(body),\n\t\t})\n\t}\n\n}\n"],"names":["project","maskToken"],"mappings":";;;AAIO,MAAM,YAAY;AAAA,EACxB,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,OAAO,SAAwB,OAAkC;AACvE,UAAA,WAAW,MAAM,KAAK,QAAQ,WAAW,QAAQ,EAAE,SAAS,MAAA,CAAO;AAErE,QAAA,CAAC,SAAS,IAAI;AACXA,YAAAA,WAAU,KAAK,sBAAsB,IAAI;AACzC,YAAA,cAAcC,UAAAA,UAAUD,SAAQ,KAAK;AACrC,YAAA,2CAA2CA,SAAQ,aAAa,uBAAuB,WAAW,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,EAAK,MAAM,SAAS,KAAM,CAAA;AAAA,IAC7L;AAAA,EACD;AAAA,EAEA,MAAc,QAAQ,MAAc,QAAgB,MAA8B;AAC3E,UAAA,UAAU,KAAK,sBAAsB,IAAI;AAC3C,QAAA,CAAC,QAAQ,eAAe;AACrB,YAAA,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM,MAAM,GAAG,QAAQ,aAAa,IAAI,IAAI,IAAI;AAAA,MACtD;AAAA,MACA,SAAS,EAAE,gBAAgB,oBAAoB,iBAAiB,UAAU,QAAQ,KAAK,GAAG;AAAA,MAC1F,MAAM,KAAK,UAAU,IAAI;AAAA,IAAA,CACzB;AAAA,EACF;AAED;;"}
|
|
@@ -8,7 +8,7 @@ class AdminClient {
|
|
|
8
8
|
if (!response.ok) {
|
|
9
9
|
const project2 = this.remoteProjectProvider.get();
|
|
10
10
|
const maskedToken = maskToken(project2.token);
|
|
11
|
-
throw `Failed to deploy admin, POST request to ${project2.
|
|
11
|
+
throw `Failed to deploy admin, POST request to ${project2.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}
|
|
12
12
|
${await response.text()}`;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminClient.js","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.
|
|
1
|
+
{"version":3,"file":"AdminClient.js","sources":["../../../../../../packages/cli/src/lib/admin/AdminClient.ts"],"sourcesContent":["import { maskToken } from '../maskToken'\nimport { RemoteProjectProvider } from '../project/RemoteProjectProvider'\n\nexport type AdminFiles = Array<{ path: string; data: string }>\nexport class AdminClient {\n\tconstructor(\n\t\tprivate readonly remoteProjectProvider: RemoteProjectProvider,\n\t) {\n\t}\n\n\tpublic async deploy(project: string | null, files: AdminFiles): Promise<void> {\n\t\tconst response = await this.execute('_deploy', 'POST', { project, files })\n\n\t\tif (!response.ok) {\n\t\t\tconst project = this.remoteProjectProvider.get()\n\t\t\tconst maskedToken = maskToken(project.token)\n\t\t\tthrow `Failed to deploy admin, POST request to ${project.adminEndpoint}/_deploy with token ${maskedToken} returned status ${response.status} ${response.statusText}\\n${await response.text()}`\n\t\t}\n\t}\n\n\tprivate async execute(path: string, method: string, body: any): Promise<Response> {\n\t\tconst project = this.remoteProjectProvider.get()\n\t\tif (!project.adminEndpoint) {\n\t\t\tthrow new Error('Admin endpoint not set')\n\t\t}\n\t\treturn await fetch(`${project.adminEndpoint}/${path}`, {\n\t\t\tmethod: method,\n\t\t\theaders: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${project.token}` },\n\t\t\tbody: JSON.stringify(body),\n\t\t})\n\t}\n\n}\n"],"names":["project"],"mappings":";AAIO,MAAM,YAAY;AAAA,EACxB,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,OAAO,SAAwB,OAAkC;AACvE,UAAA,WAAW,MAAM,KAAK,QAAQ,WAAW,QAAQ,EAAE,SAAS,MAAA,CAAO;AAErE,QAAA,CAAC,SAAS,IAAI;AACXA,YAAAA,WAAU,KAAK,sBAAsB,IAAI;AACzC,YAAA,cAAc,UAAUA,SAAQ,KAAK;AACrC,YAAA,2CAA2CA,SAAQ,aAAa,uBAAuB,WAAW,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,EAAK,MAAM,SAAS,KAAM,CAAA;AAAA,IAC7L;AAAA,EACD;AAAA,EAEA,MAAc,QAAQ,MAAc,QAAgB,MAA8B;AAC3E,UAAA,UAAU,KAAK,sBAAsB,IAAI;AAC3C,QAAA,CAAC,QAAQ,eAAe;AACrB,YAAA,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,MAAM,MAAM,GAAG,QAAQ,aAAa,IAAI,IAAI,IAAI;AAAA,MACtD;AAAA,MACA,SAAS,EAAE,gBAAgB,oBAAoB,iBAAiB,UAAU,QAAQ,KAAK,GAAG;AAAA,MAC1F,MAAM,KAAK,UAAU,IAAI;AAAA,IAAA,CACzB;AAAA,EACF;AAED;"}
|
|
@@ -6,7 +6,7 @@ class RemoteProjectResolver {
|
|
|
6
6
|
constructor(cliEnv) {
|
|
7
7
|
this.cliEnv = cliEnv;
|
|
8
8
|
}
|
|
9
|
-
resolve(identifier) {
|
|
9
|
+
resolve(identifier, adminEndpoint) {
|
|
10
10
|
let endpoint;
|
|
11
11
|
let token;
|
|
12
12
|
let project;
|
|
@@ -22,7 +22,11 @@ class RemoteProjectResolver {
|
|
|
22
22
|
if (!project || !endpoint || !token) {
|
|
23
23
|
return void 0;
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
if (!adminEndpoint && (endpoint.endsWith(".contember.cloud") || !endpoint.includes("://api-"))) {
|
|
26
|
+
adminEndpoint = endpoint;
|
|
27
|
+
endpoint += "/_api";
|
|
28
|
+
}
|
|
29
|
+
return new RemoteProject.RemoteProject(project, endpoint, token, adminEndpoint);
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
32
|
exports.RemoteProjectResolver = RemoteProjectResolver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteProjectResolver.cjs","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token)\n\t}\n}\n"],"names":["parseDsn","RemoteProject"],"mappings":";;;;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,
|
|
1
|
+
{"version":3,"file":"RemoteProjectResolver.cjs","sources":["../../../../../../packages/cli/src/lib/project/RemoteProjectResolver.ts"],"sourcesContent":["import { parseDsn } from '../dsn'\nimport { RemoteProject } from './RemoteProject'\nimport { CliEnv } from '../env'\n\nexport class RemoteProjectResolver {\n\tconstructor(\n\t\tprivate readonly cliEnv: CliEnv,\n\t) {\n\t}\n\n\tresolve(identifier?: string, adminEndpoint?: string): RemoteProject | undefined {\n\t\tlet endpoint: string | undefined\n\t\tlet token: string | undefined\n\t\tlet project: string | undefined\n\t\tif (identifier?.includes('://')) {\n\t\t\t({ endpoint, project, token } = parseDsn(identifier))\n\t\t} else if (this.cliEnv.dsn) {\n\t\t\t({ endpoint, project, token } = parseDsn(this.cliEnv.dsn))\n\t\t} else {\n\t\t\tendpoint = this.cliEnv.apiUrl\n\t\t\ttoken = this.cliEnv.apiToken\n\t\t\tproject = !identifier || identifier === '.' ? this.cliEnv.projectName : identifier\n\t\t}\n\t\tif (!project || !endpoint || !token) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (!adminEndpoint && (endpoint.endsWith('.contember.cloud') || !endpoint.includes('://api-'))) {\n\t\t\tadminEndpoint = endpoint\n\t\t\tendpoint += '/_api'\n\t\t}\n\n\t\treturn new RemoteProject(project, endpoint, token, adminEndpoint)\n\t}\n}\n"],"names":["parseDsn","RemoteProject"],"mappings":";;;;AAIO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,QAAQ,YAAqB,eAAmD;AAC3E,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA,YAAY,SAAS,KAAK,GAAG;AAChC,OAAC,EAAE,UAAU,SAAS,MAAM,IAAIA,IAAAA,SAAS,UAAU;AAAA,IAAA,WACzC,KAAK,OAAO,KAAK;AAC1B,OAAA,EAAE,UAAU,SAAS,MAAA,IAAUA,IAAAA,SAAS,KAAK,OAAO,GAAG;AAAA,IAAA,OAClD;AACN,iBAAW,KAAK,OAAO;AACvB,cAAQ,KAAK,OAAO;AACpB,gBAAU,CAAC,cAAc,eAAe,MAAM,KAAK,OAAO,cAAc;AAAA,IACzE;AACA,QAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO;AAC7B,aAAA;AAAA,IACR;AAEI,QAAA,CAAC,kBAAkB,SAAS,SAAS,kBAAkB,KAAK,CAAC,SAAS,SAAS,SAAS,IAAI;AAC/E,sBAAA;AACJ,kBAAA;AAAA,IACb;AAEA,WAAO,IAAIC,cAAA,cAAc,SAAS,UAAU,OAAO,aAAa;AAAA,EACjE;AACD;;"}
|
|
@@ -4,7 +4,7 @@ class RemoteProjectResolver {
|
|
|
4
4
|
constructor(cliEnv) {
|
|
5
5
|
this.cliEnv = cliEnv;
|
|
6
6
|
}
|
|
7
|
-
resolve(identifier) {
|
|
7
|
+
resolve(identifier, adminEndpoint) {
|
|
8
8
|
let endpoint;
|
|
9
9
|
let token;
|
|
10
10
|
let project;
|
|
@@ -20,7 +20,11 @@ class RemoteProjectResolver {
|
|
|
20
20
|
if (!project || !endpoint || !token) {
|
|
21
21
|
return void 0;
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
if (!adminEndpoint && (endpoint.endsWith(".contember.cloud") || !endpoint.includes("://api-"))) {
|
|
24
|
+
adminEndpoint = endpoint;
|
|
25
|
+
endpoint += "/_api";
|
|
26
|
+
}
|
|
27
|
+
return new RemoteProject(project, endpoint, token, adminEndpoint);
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
export {
|