@feathersjs/cli 5.0.0-pre.29 → 5.0.0-pre.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -39
- package/bin/feathers +3 -6
- package/lib/app/index.js +33 -10
- package/lib/app/index.js.map +1 -1
- package/lib/app/index.ts +81 -53
- package/lib/app/templates/app.test.tpl.js +1 -1
- package/lib/app/templates/app.test.tpl.js.map +1 -1
- package/lib/app/templates/app.test.tpl.ts +1 -2
- package/lib/app/templates/app.tpl.js +7 -7
- package/lib/app/templates/app.tpl.js.map +1 -1
- package/lib/app/templates/app.tpl.ts +7 -9
- package/lib/app/templates/channels.tpl.js +1 -1
- package/lib/app/templates/channels.tpl.js.map +1 -1
- package/lib/app/templates/channels.tpl.ts +1 -2
- package/lib/app/templates/client.tpl.js +2 -2
- package/lib/app/templates/client.tpl.js.map +1 -1
- package/lib/app/templates/client.tpl.ts +2 -3
- package/lib/app/templates/declarations.tpl.js +3 -3
- package/lib/app/templates/declarations.tpl.js.map +1 -1
- package/lib/app/templates/declarations.tpl.ts +5 -4
- package/lib/app/templates/index.html.tpl.js +12 -52
- package/lib/app/templates/index.html.tpl.js.map +1 -1
- package/lib/app/templates/index.html.tpl.ts +12 -53
- package/lib/app/templates/index.tpl.js +1 -1
- package/lib/app/templates/index.tpl.js.map +1 -1
- package/lib/app/templates/index.tpl.ts +1 -2
- package/lib/app/templates/logger.tpl.js +1 -1
- package/lib/app/templates/logger.tpl.js.map +1 -1
- package/lib/app/templates/logger.tpl.ts +2 -2
- package/lib/app/templates/package.json.tpl.js +4 -3
- package/lib/app/templates/package.json.tpl.js.map +1 -1
- package/lib/app/templates/package.json.tpl.ts +5 -3
- package/lib/app/templates/readme.md.tpl.js +11 -7
- package/lib/app/templates/readme.md.tpl.js.map +1 -1
- package/lib/app/templates/readme.md.tpl.ts +15 -8
- package/lib/app/templates/{configuration.tpl.d.ts → schemas.tpl.d.ts} +0 -0
- package/lib/app/templates/schemas.tpl.js +76 -0
- package/lib/app/templates/schemas.tpl.js.map +1 -0
- package/lib/app/templates/schemas.tpl.ts +90 -0
- package/lib/app/templates/services.tpl.js +1 -1
- package/lib/app/templates/services.tpl.js.map +1 -1
- package/lib/app/templates/services.tpl.ts +1 -2
- package/lib/authentication/index.d.ts +4 -3
- package/lib/authentication/index.js +12 -3
- package/lib/authentication/index.js.map +1 -1
- package/lib/authentication/index.ts +23 -5
- package/lib/authentication/templates/authentication.tpl.js +1 -1
- package/lib/authentication/templates/authentication.tpl.js.map +1 -1
- package/lib/authentication/templates/authentication.tpl.ts +3 -2
- package/lib/authentication/templates/config.tpl.js +1 -1
- package/lib/authentication/templates/config.tpl.js.map +1 -1
- package/lib/authentication/templates/config.tpl.ts +1 -1
- package/lib/authentication/templates/declarations.tpl.js +3 -3
- package/lib/authentication/templates/declarations.tpl.js.map +1 -1
- package/lib/authentication/templates/declarations.tpl.ts +9 -4
- package/lib/authentication/templates/knex.tpl.js +2 -2
- package/lib/authentication/templates/knex.tpl.js.map +1 -1
- package/lib/authentication/templates/knex.tpl.ts +2 -2
- package/lib/authentication/templates/{user.resolver.tpl.d.ts → schema.json.tpl.d.ts} +0 -0
- package/lib/authentication/templates/schema.json.tpl.js +92 -0
- package/lib/authentication/templates/schema.json.tpl.js.map +1 -0
- package/lib/authentication/templates/schema.json.tpl.ts +108 -0
- package/lib/authentication/templates/{user.schema.tpl.d.ts → schema.typebox.tpl.d.ts} +1 -0
- package/lib/authentication/templates/schema.typebox.tpl.js +79 -0
- package/lib/authentication/templates/schema.typebox.tpl.js.map +1 -0
- package/lib/authentication/templates/schema.typebox.tpl.ts +94 -0
- package/lib/authentication/templates/test.tpl.js +2 -2
- package/lib/authentication/templates/test.tpl.js.map +1 -1
- package/lib/authentication/templates/test.tpl.ts +6 -3
- package/lib/cli.d.ts +6 -0
- package/lib/cli.js +75 -0
- package/lib/cli.js.map +1 -0
- package/lib/cli.ts +68 -0
- package/lib/commons.d.ts +14 -1
- package/lib/commons.js +24 -4
- package/lib/commons.js.map +1 -1
- package/lib/commons.ts +29 -1
- package/lib/connection/index.d.ts +5 -3
- package/lib/connection/index.js +5 -3
- package/lib/connection/index.js.map +1 -1
- package/lib/connection/index.ts +19 -5
- package/lib/connection/templates/knex.tpl.js +2 -12
- package/lib/connection/templates/knex.tpl.js.map +1 -1
- package/lib/connection/templates/knex.tpl.ts +6 -20
- package/lib/connection/templates/mongodb.tpl.js +1 -3
- package/lib/connection/templates/mongodb.tpl.js.map +1 -1
- package/lib/connection/templates/mongodb.tpl.ts +1 -12
- package/lib/hook/index.d.ts +1 -1
- package/lib/hook/index.js +3 -0
- package/lib/hook/index.js.map +1 -1
- package/lib/hook/index.ts +3 -1
- package/lib/hook/templates/hook.tpl.js +2 -3
- package/lib/hook/templates/hook.tpl.js.map +1 -1
- package/lib/hook/templates/hook.tpl.ts +5 -3
- package/lib/index.d.ts +2 -16
- package/lib/index.js +16 -24
- package/lib/index.js.map +1 -1
- package/lib/index.ts +2 -28
- package/lib/service/index.d.ts +10 -2
- package/lib/service/index.js +79 -41
- package/lib/service/index.js.map +1 -1
- package/lib/service/index.ts +54 -6
- package/lib/service/templates/client.tpl.js +19 -11
- package/lib/service/templates/client.tpl.js.map +1 -1
- package/lib/service/templates/client.tpl.ts +34 -17
- package/lib/service/templates/{class.tpl.d.ts → schema.json.tpl.d.ts} +0 -0
- package/lib/service/templates/schema.json.tpl.js +73 -0
- package/lib/service/templates/schema.json.tpl.js.map +1 -0
- package/lib/service/templates/schema.json.tpl.ts +85 -0
- package/lib/service/templates/{resolver.tpl.d.ts → schema.typebox.tpl.d.ts} +0 -0
- package/lib/service/templates/schema.typebox.tpl.js +58 -0
- package/lib/service/templates/schema.typebox.tpl.js.map +1 -0
- package/lib/service/templates/schema.typebox.tpl.ts +70 -0
- package/lib/service/templates/service.tpl.d.ts +1 -0
- package/lib/service/templates/service.tpl.js +67 -15
- package/lib/service/templates/service.tpl.js.map +1 -1
- package/lib/service/templates/service.tpl.ts +98 -19
- package/lib/service/templates/test.tpl.js +1 -1
- package/lib/service/templates/test.tpl.js.map +1 -1
- package/lib/service/templates/test.tpl.ts +1 -2
- package/lib/service/type/custom.tpl.d.ts +1 -2
- package/lib/service/type/custom.tpl.js +32 -25
- package/lib/service/type/custom.tpl.js.map +1 -1
- package/lib/service/type/custom.tpl.ts +44 -35
- package/lib/service/type/knex.tpl.d.ts +1 -3
- package/lib/service/type/knex.tpl.js +33 -23
- package/lib/service/type/knex.tpl.js.map +1 -1
- package/lib/service/type/knex.tpl.ts +51 -29
- package/lib/service/type/mongodb.tpl.d.ts +1 -2
- package/lib/service/type/mongodb.tpl.js +30 -20
- package/lib/service/type/mongodb.tpl.js.map +1 -1
- package/lib/service/type/mongodb.tpl.ts +47 -29
- package/package.json +22 -23
- package/lib/app/templates/configuration.tpl.js +0 -45
- package/lib/app/templates/configuration.tpl.js.map +0 -1
- package/lib/app/templates/configuration.tpl.ts +0 -50
- package/lib/authentication/templates/user.resolver.tpl.js +0 -98
- package/lib/authentication/templates/user.resolver.tpl.js.map +0 -1
- package/lib/authentication/templates/user.resolver.tpl.ts +0 -111
- package/lib/authentication/templates/user.schema.tpl.js +0 -79
- package/lib/authentication/templates/user.schema.tpl.js.map +0 -1
- package/lib/authentication/templates/user.schema.tpl.ts +0 -87
- package/lib/service/templates/class.tpl.js +0 -63
- package/lib/service/templates/class.tpl.js.map +0 -1
- package/lib/service/templates/class.tpl.ts +0 -79
- package/lib/service/templates/resolver.tpl.js +0 -73
- package/lib/service/templates/resolver.tpl.js.map +0 -1
- package/lib/service/templates/resolver.tpl.ts +0 -78
- package/lib/service/templates/schema.tpl.d.ts +0 -2
- package/lib/service/templates/schema.tpl.js +0 -75
- package/lib/service/templates/schema.tpl.js.map +0 -1
- package/lib/service/templates/schema.tpl.ts +0 -80
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generate = exports.template = void 0;
|
|
4
|
+
const pinion_1 = require("@feathershq/pinion");
|
|
5
|
+
const commons_1 = require("../../commons");
|
|
6
|
+
const template = ({ camelName, upperName, authStrategies, type, relative }) => /* ts */ `import { jsonSchema, resolve } from '@feathersjs/schema'
|
|
7
|
+
import { Type, querySyntax } from '@feathersjs/typebox'
|
|
8
|
+
import type { Static } from '@feathersjs/typebox'
|
|
9
|
+
${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''}
|
|
10
|
+
|
|
11
|
+
import type { HookContext } from '${relative}/declarations'
|
|
12
|
+
import { dataValidator, queryValidator } from '${relative}/schemas/validators'
|
|
13
|
+
|
|
14
|
+
// Schema for the basic data model (e.g. creating new entries)
|
|
15
|
+
export const ${camelName}DataSchema = Type.Object({
|
|
16
|
+
${authStrategies
|
|
17
|
+
.map((name) => name === 'local'
|
|
18
|
+
? ` email: Type.String(),
|
|
19
|
+
password: Type.String()`
|
|
20
|
+
: ` ${name}Id: Type.Optional(Type.String())`)
|
|
21
|
+
.join(',\n')}
|
|
22
|
+
}, { $id: '${upperName}Data', additionalProperties: false })
|
|
23
|
+
export type ${upperName}Data = Static<typeof ${camelName}DataSchema>
|
|
24
|
+
export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator)
|
|
25
|
+
export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({
|
|
26
|
+
properties: {
|
|
27
|
+
${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''}
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Schema for the data that is being returned
|
|
32
|
+
export const ${camelName}Schema = Type.Intersect([
|
|
33
|
+
${camelName}DataSchema,
|
|
34
|
+
Type.Object({
|
|
35
|
+
${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'}
|
|
36
|
+
})
|
|
37
|
+
], { $id: '${upperName}' })
|
|
38
|
+
export type ${upperName} = Static<typeof ${camelName}Schema>
|
|
39
|
+
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({
|
|
40
|
+
properties: {}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({
|
|
44
|
+
properties: {
|
|
45
|
+
// The password should never be visible externally
|
|
46
|
+
password: async () => undefined
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// Schema for allowed query properties
|
|
51
|
+
export const ${camelName}QuerySchema = Type.Intersect([
|
|
52
|
+
querySyntax(${camelName}Schema),
|
|
53
|
+
// Add additional query properties here
|
|
54
|
+
Type.Object({})
|
|
55
|
+
])
|
|
56
|
+
export type ${upperName}Query = Static<typeof ${camelName}QuerySchema>
|
|
57
|
+
export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator)
|
|
58
|
+
export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({
|
|
59
|
+
properties: {
|
|
60
|
+
// If there is a user (e.g. with authentication), they are only allowed to see their own data
|
|
61
|
+
${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => {
|
|
62
|
+
if (context.params.user) {
|
|
63
|
+
return context.params.user.${type === 'mongodb' ? '_id' : 'id'}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return value
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
`;
|
|
71
|
+
exports.template = template;
|
|
72
|
+
const generate = (ctx) => (0, pinion_1.generator)(ctx).then((0, pinion_1.when)(({ schema }) => schema === 'typebox', (0, commons_1.renderSource)(exports.template, (0, pinion_1.toFile)(({ lib, folder, fileName }) => [
|
|
73
|
+
lib,
|
|
74
|
+
'services',
|
|
75
|
+
...folder,
|
|
76
|
+
`${fileName}.schema`
|
|
77
|
+
]), { force: true })));
|
|
78
|
+
exports.generate = generate;
|
|
79
|
+
//# sourceMappingURL=schema.typebox.tpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.typebox.tpl.js","sourceRoot":"","sources":["../../../src/authentication/templates/schema.typebox.tpl.ts"],"names":[],"mappings":";;;AAAA,+CAA4D;AAC5D,2CAA4C;AAGrC,MAAM,QAAQ,GAAG,CAAC,EACvB,SAAS,EACT,SAAS,EACT,cAAc,EACd,IAAI,EACJ,QAAQ,EACuB,EAAE,EAAE,CAAC,QAAQ,CAAC;;;EAG7C,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,EAAE;;oCAEvE,QAAQ;iDACK,QAAQ;;;eAG1C,SAAS;IACpB,cAAc;KACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,KAAK,OAAO;IACd,CAAC,CAAC;0BACgB;IAClB,CAAC,CAAC,OAAO,IAAI,kCAAkC,CAClD;KACA,IAAI,CAAC,KAAK,CAAC;aACH,SAAS;cACR,SAAS,wBAAwB,SAAS;eACzC,SAAS,+CAA+C,SAAS;eACjE,SAAS,0BAA0B,SAAS;;MAErD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,EAAE;;;;;eAK9E,SAAS;IACpB,SAAS;;MAEP,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB;;aAExD,SAAS;cACR,SAAS,oBAAoB,SAAS;eACrC,SAAS,sBAAsB,SAAS;;;;eAIxC,SAAS,8BAA8B,SAAS;;;;;;;;eAQhD,SAAS;gBACR,SAAS;;;;cAIX,SAAS,yBAAyB,SAAS;eAC1C,SAAS,4CAA4C,SAAS;eAC9D,SAAS,2BAA2B,SAAS;;;MAGtD,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;qCAEF,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;;;;;;CAOrE,CAAA;AAxEY,QAAA,QAAQ,YAwEpB;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAmC,EAAE,EAAE,CAC9D,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC,IAAI,CACjB,IAAA,aAAI,EACF,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,EACpC,IAAA,sBAAY,EACV,gBAAQ,EACR,IAAA,eAAM,EAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAkC,EAAE,EAAE,CAAC;IACpE,GAAG;IACH,UAAU;IACV,GAAG,MAAM;IACT,GAAG,QAAQ,SAAS;CACrB,CAAC,EACF,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CACF,CACF,CAAA;AAfU,QAAA,QAAQ,YAelB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { generator, toFile, when } from '@feathershq/pinion'
|
|
2
|
+
import { renderSource } from '../../commons'
|
|
3
|
+
import { AuthenticationGeneratorContext } from '../index'
|
|
4
|
+
|
|
5
|
+
export const template = ({
|
|
6
|
+
camelName,
|
|
7
|
+
upperName,
|
|
8
|
+
authStrategies,
|
|
9
|
+
type,
|
|
10
|
+
relative
|
|
11
|
+
}: AuthenticationGeneratorContext) => /* ts */ `import { jsonSchema, resolve } from '@feathersjs/schema'
|
|
12
|
+
import { Type, querySyntax } from '@feathersjs/typebox'
|
|
13
|
+
import type { Static } from '@feathersjs/typebox'
|
|
14
|
+
${authStrategies.includes('local') ? `import { passwordHash } from '@feathersjs/authentication-local'` : ''}
|
|
15
|
+
|
|
16
|
+
import type { HookContext } from '${relative}/declarations'
|
|
17
|
+
import { dataValidator, queryValidator } from '${relative}/schemas/validators'
|
|
18
|
+
|
|
19
|
+
// Schema for the basic data model (e.g. creating new entries)
|
|
20
|
+
export const ${camelName}DataSchema = Type.Object({
|
|
21
|
+
${authStrategies
|
|
22
|
+
.map((name) =>
|
|
23
|
+
name === 'local'
|
|
24
|
+
? ` email: Type.String(),
|
|
25
|
+
password: Type.String()`
|
|
26
|
+
: ` ${name}Id: Type.Optional(Type.String())`
|
|
27
|
+
)
|
|
28
|
+
.join(',\n')}
|
|
29
|
+
}, { $id: '${upperName}Data', additionalProperties: false })
|
|
30
|
+
export type ${upperName}Data = Static<typeof ${camelName}DataSchema>
|
|
31
|
+
export const ${camelName}DataValidator = jsonSchema.getDataValidator(${camelName}DataSchema, dataValidator)
|
|
32
|
+
export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext>({
|
|
33
|
+
properties: {
|
|
34
|
+
${authStrategies.includes('local') ? `password: passwordHash({ strategy: 'local' })` : ''}
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// Schema for the data that is being returned
|
|
39
|
+
export const ${camelName}Schema = Type.Intersect([
|
|
40
|
+
${camelName}DataSchema,
|
|
41
|
+
Type.Object({
|
|
42
|
+
${type === 'mongodb' ? '_id: Type.String()' : 'id: Type.Number()'}
|
|
43
|
+
})
|
|
44
|
+
], { $id: '${upperName}' })
|
|
45
|
+
export type ${upperName} = Static<typeof ${camelName}Schema>
|
|
46
|
+
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({
|
|
47
|
+
properties: {}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({
|
|
51
|
+
properties: {
|
|
52
|
+
// The password should never be visible externally
|
|
53
|
+
password: async () => undefined
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// Schema for allowed query properties
|
|
58
|
+
export const ${camelName}QuerySchema = Type.Intersect([
|
|
59
|
+
querySyntax(${camelName}Schema),
|
|
60
|
+
// Add additional query properties here
|
|
61
|
+
Type.Object({})
|
|
62
|
+
])
|
|
63
|
+
export type ${upperName}Query = Static<typeof ${camelName}QuerySchema>
|
|
64
|
+
export const ${camelName}QueryValidator = jsonSchema.getValidator(${camelName}QuerySchema, queryValidator)
|
|
65
|
+
export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext>({
|
|
66
|
+
properties: {
|
|
67
|
+
// If there is a user (e.g. with authentication), they are only allowed to see their own data
|
|
68
|
+
${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => {
|
|
69
|
+
if (context.params.user) {
|
|
70
|
+
return context.params.user.${type === 'mongodb' ? '_id' : 'id'}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return value
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
`
|
|
78
|
+
|
|
79
|
+
export const generate = (ctx: AuthenticationGeneratorContext) =>
|
|
80
|
+
generator(ctx).then(
|
|
81
|
+
when<AuthenticationGeneratorContext>(
|
|
82
|
+
({ schema }) => schema === 'typebox',
|
|
83
|
+
renderSource(
|
|
84
|
+
template,
|
|
85
|
+
toFile(({ lib, folder, fileName }: AuthenticationGeneratorContext) => [
|
|
86
|
+
lib,
|
|
87
|
+
'services',
|
|
88
|
+
...folder,
|
|
89
|
+
`${fileName}.schema`
|
|
90
|
+
]),
|
|
91
|
+
{ force: true }
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
)
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generate = void 0;
|
|
4
4
|
const pinion_1 = require("@feathershq/pinion");
|
|
5
5
|
const commons_1 = require("../../commons");
|
|
6
|
-
const template = ({ authStrategies, lib }) => `import assert from 'assert';
|
|
6
|
+
const template = ({ authStrategies, path, lib }) => /* ts */ `import assert from 'assert';
|
|
7
7
|
import { app } from '../${lib}/app';
|
|
8
8
|
|
|
9
9
|
describe('authentication', () => {
|
|
@@ -16,7 +16,7 @@ describe('authentication', () => {
|
|
|
16
16
|
|
|
17
17
|
before(async () => {
|
|
18
18
|
try {
|
|
19
|
-
await app.service('
|
|
19
|
+
await app.service('${path}').create(userInfo)
|
|
20
20
|
} catch (error) {
|
|
21
21
|
// Do nothing, it just means the user already exists and can be tested
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.tpl.js","sourceRoot":"","sources":["../../../src/authentication/templates/test.tpl.ts"],"names":[],"mappings":";;;AAAA,+CAAsD;AACtD,2CAA4C;AAG5C,MAAM,QAAQ,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"test.tpl.js","sourceRoot":"","sources":["../../../src/authentication/templates/test.tpl.ts"],"names":[],"mappings":";;;AAAA,+CAAsD;AACtD,2CAA4C;AAG5C,MAAM,QAAQ,GAAG,CAAC,EAChB,cAAc,EACd,IAAI,EACJ,GAAG,EAC4B,EAAE,EAAE,CAAC,QAAQ,CAAC;0BACrB,GAAG;;;IAIzB,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC9B,CAAC,CAAC;;;;;;;;2BAQmB,IAAI;;;;;;;;;;;;;;KAc1B;IACC,CAAC,CAAC,EACN;;;;;;CAMD,CAAA;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAmC,EAAE,EAAE,CAC9D,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC,IAAI,CACjB,IAAA,sBAAY,EACV,QAAQ,EACR,IAAA,eAAM,EAAiC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAClF,CACF,CAAA;AANU,QAAA,QAAQ,YAMlB"}
|
|
@@ -2,8 +2,11 @@ import { generator, toFile } from '@feathershq/pinion'
|
|
|
2
2
|
import { renderSource } from '../../commons'
|
|
3
3
|
import { AuthenticationGeneratorContext } from '../index'
|
|
4
4
|
|
|
5
|
-
const template = ({
|
|
6
|
-
|
|
5
|
+
const template = ({
|
|
6
|
+
authStrategies,
|
|
7
|
+
path,
|
|
8
|
+
lib
|
|
9
|
+
}: AuthenticationGeneratorContext) => /* ts */ `import assert from 'assert';
|
|
7
10
|
import { app } from '../${lib}/app';
|
|
8
11
|
|
|
9
12
|
describe('authentication', () => {
|
|
@@ -17,7 +20,7 @@ describe('authentication', () => {
|
|
|
17
20
|
|
|
18
21
|
before(async () => {
|
|
19
22
|
try {
|
|
20
|
-
await app.service('
|
|
23
|
+
await app.service('${path}').create(userInfo)
|
|
21
24
|
} catch (error) {
|
|
22
25
|
// Do nothing, it just means the user already exists and can be tested
|
|
23
26
|
}
|
package/lib/cli.d.ts
ADDED
package/lib/cli.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.program = exports.commandRunner = exports.chalk = void 0;
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
exports.chalk = chalk_1.default;
|
|
23
|
+
const commander_1 = require("commander");
|
|
24
|
+
const pinion_1 = require("@feathershq/pinion");
|
|
25
|
+
const commons_1 = require("./commons");
|
|
26
|
+
__exportStar(require("commander"), exports);
|
|
27
|
+
const commandRunner = (name) => async (options) => {
|
|
28
|
+
const ctx = (0, pinion_1.getContext)({
|
|
29
|
+
...options
|
|
30
|
+
});
|
|
31
|
+
await (0, pinion_1.generator)(ctx)
|
|
32
|
+
.then((0, pinion_1.runGenerator)(__dirname, name, 'index'))
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
const { logger } = ctx.pinion;
|
|
35
|
+
logger.error(`Error: ${chalk_1.default.white(error.message)}`);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
exports.commandRunner = commandRunner;
|
|
39
|
+
exports.program = new commander_1.Command();
|
|
40
|
+
exports.program
|
|
41
|
+
.name('feathers')
|
|
42
|
+
.description('The Feathers command line interface 🕊️')
|
|
43
|
+
.version(commons_1.version)
|
|
44
|
+
.showHelpAfterError();
|
|
45
|
+
const generate = exports.program.command('generate').alias('g');
|
|
46
|
+
generate
|
|
47
|
+
.command('app')
|
|
48
|
+
.description('Generate a new application')
|
|
49
|
+
.option('--name <name>', 'The name of the application')
|
|
50
|
+
.action((0, exports.commandRunner)('app'));
|
|
51
|
+
generate
|
|
52
|
+
.command('service')
|
|
53
|
+
.description('Generate a new service')
|
|
54
|
+
.option('--name <name>', 'The service name')
|
|
55
|
+
.option('--path <path>', 'The path to register the service on')
|
|
56
|
+
.option('--type <type>', 'The service type (knex, mongodb, custom)')
|
|
57
|
+
.action((0, exports.commandRunner)('service'));
|
|
58
|
+
generate
|
|
59
|
+
.command('hook')
|
|
60
|
+
.description('Generate a hook')
|
|
61
|
+
.option('--name <name>', 'The name of the hook')
|
|
62
|
+
.option('--type <type>', 'The hook type (around or regular)')
|
|
63
|
+
.action((0, exports.commandRunner)('hook'));
|
|
64
|
+
generate
|
|
65
|
+
.command('connection')
|
|
66
|
+
.description('Add a new database connection')
|
|
67
|
+
.action((0, exports.commandRunner)('connection'));
|
|
68
|
+
generate
|
|
69
|
+
.command('authentication')
|
|
70
|
+
.description('Add authentication to the application')
|
|
71
|
+
.action((0, exports.commandRunner)('authentication'));
|
|
72
|
+
generate.description(`Run a generator. Currently available: \n ${generate.commands
|
|
73
|
+
.map((cmd) => `${chalk_1.default.blue(cmd.name())}: ${cmd.description()} `)
|
|
74
|
+
.join('\n ')}`);
|
|
75
|
+
//# sourceMappingURL=cli.js.map
|
package/lib/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,kDAAyB;AAMhB,gBANF,eAAK,CAME;AALd,yCAAmC;AACnC,+CAAwE;AACxE,uCAAwD;AAExD,4CAAyB;AAGlB,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;IACpE,MAAM,GAAG,GAAG,IAAA,mBAAU,EAAsB;QAC1C,GAAG,OAAO;KACX,CAAC,CAAA;IAEF,MAAM,IAAA,kBAAS,EAAC,GAAG,CAAC;SACjB,IAAI,CAAC,IAAA,qBAAY,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;SAC5C,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;QAE7B,MAAM,CAAC,KAAK,CAAC,UAAU,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAZY,QAAA,aAAa,iBAYzB;AAEY,QAAA,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAEpC,eAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,iBAAO,CAAC;KAChB,kBAAkB,EAAE,CAAA;AAEvB,MAAM,QAAQ,GAAG,eAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAEvD,QAAQ;KACL,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;KACtD,MAAM,CAAC,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC,CAAA;AAE/B,QAAQ;KACL,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;KACnE,MAAM,CAAC,IAAA,qBAAa,EAAC,SAAS,CAAC,CAAC,CAAA;AAEnC,QAAQ;KACL,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,mCAAmC,CAAC;KAC5D,MAAM,CAAC,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC,CAAA;AAEhC,QAAQ;KACL,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,IAAA,qBAAa,EAAC,YAAY,CAAC,CAAC,CAAA;AAEtC,QAAQ;KACL,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,IAAA,qBAAa,EAAC,gBAAgB,CAAC,CAAC,CAAA;AAE1C,QAAQ,CAAC,WAAW,CAClB,6CAA6C,QAAQ,CAAC,QAAQ;KAC3D,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;KAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAClB,CAAA"}
|
package/lib/cli.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import { Command } from 'commander'
|
|
3
|
+
import { generator, runGenerator, getContext } from '@feathershq/pinion'
|
|
4
|
+
import { FeathersBaseContext, version } from './commons'
|
|
5
|
+
|
|
6
|
+
export * from 'commander'
|
|
7
|
+
export { chalk }
|
|
8
|
+
|
|
9
|
+
export const commandRunner = (name: string) => async (options: any) => {
|
|
10
|
+
const ctx = getContext<FeathersBaseContext>({
|
|
11
|
+
...options
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
await generator(ctx)
|
|
15
|
+
.then(runGenerator(__dirname, name, 'index'))
|
|
16
|
+
.catch((error) => {
|
|
17
|
+
const { logger } = ctx.pinion
|
|
18
|
+
|
|
19
|
+
logger.error(`Error: ${chalk.white(error.message)}`)
|
|
20
|
+
})
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const program = new Command()
|
|
24
|
+
|
|
25
|
+
program
|
|
26
|
+
.name('feathers')
|
|
27
|
+
.description('The Feathers command line interface 🕊️')
|
|
28
|
+
.version(version)
|
|
29
|
+
.showHelpAfterError()
|
|
30
|
+
|
|
31
|
+
const generate = program.command('generate').alias('g')
|
|
32
|
+
|
|
33
|
+
generate
|
|
34
|
+
.command('app')
|
|
35
|
+
.description('Generate a new application')
|
|
36
|
+
.option('--name <name>', 'The name of the application')
|
|
37
|
+
.action(commandRunner('app'))
|
|
38
|
+
|
|
39
|
+
generate
|
|
40
|
+
.command('service')
|
|
41
|
+
.description('Generate a new service')
|
|
42
|
+
.option('--name <name>', 'The service name')
|
|
43
|
+
.option('--path <path>', 'The path to register the service on')
|
|
44
|
+
.option('--type <type>', 'The service type (knex, mongodb, custom)')
|
|
45
|
+
.action(commandRunner('service'))
|
|
46
|
+
|
|
47
|
+
generate
|
|
48
|
+
.command('hook')
|
|
49
|
+
.description('Generate a hook')
|
|
50
|
+
.option('--name <name>', 'The name of the hook')
|
|
51
|
+
.option('--type <type>', 'The hook type (around or regular)')
|
|
52
|
+
.action(commandRunner('hook'))
|
|
53
|
+
|
|
54
|
+
generate
|
|
55
|
+
.command('connection')
|
|
56
|
+
.description('Add a new database connection')
|
|
57
|
+
.action(commandRunner('connection'))
|
|
58
|
+
|
|
59
|
+
generate
|
|
60
|
+
.command('authentication')
|
|
61
|
+
.description('Add authentication to the application')
|
|
62
|
+
.action(commandRunner('authentication'))
|
|
63
|
+
|
|
64
|
+
generate.description(
|
|
65
|
+
`Run a generator. Currently available: \n ${generate.commands
|
|
66
|
+
.map((cmd) => `${chalk.blue(cmd.name())}: ${cmd.description()} `)
|
|
67
|
+
.join('\n ')}`
|
|
68
|
+
)
|
package/lib/commons.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { PackageJson } from 'type-fest';
|
|
|
2
2
|
import { Callable, PinionContext, Location } from '@feathershq/pinion';
|
|
3
3
|
import * as ts from 'typescript';
|
|
4
4
|
import { Options as PrettierOptions } from 'prettier';
|
|
5
|
+
export declare const version: any;
|
|
5
6
|
export declare type DependencyVersions = {
|
|
6
7
|
[key: string]: string;
|
|
7
8
|
};
|
|
@@ -37,6 +38,10 @@ export declare type FeathersAppInfo = {
|
|
|
37
38
|
* The HTTP framework used
|
|
38
39
|
*/
|
|
39
40
|
framework: 'koa' | 'express';
|
|
41
|
+
/**
|
|
42
|
+
* The main schema definition format
|
|
43
|
+
*/
|
|
44
|
+
schema: 'typebox' | 'json';
|
|
40
45
|
};
|
|
41
46
|
export interface AppPackageJson extends PackageJson {
|
|
42
47
|
feathers?: FeathersAppInfo;
|
|
@@ -86,9 +91,17 @@ export declare const addVersions: (dependencies: string[], versions: DependencyV
|
|
|
86
91
|
export declare const initializeBaseContext: () => <C extends FeathersBaseContext>(ctx: C) => Promise<C & {
|
|
87
92
|
lib: string;
|
|
88
93
|
test: string;
|
|
89
|
-
language: "
|
|
94
|
+
language: "ts" | "js";
|
|
90
95
|
feathers: FeathersAppInfo;
|
|
91
96
|
}>;
|
|
97
|
+
/**
|
|
98
|
+
* Checks if the current context contains a valid generated application. This is necesary for most
|
|
99
|
+
* generators (besides the app generator).
|
|
100
|
+
*
|
|
101
|
+
* @param ctx The context to check against
|
|
102
|
+
* @returns Throws an error or returns the original context
|
|
103
|
+
*/
|
|
104
|
+
export declare const checkPreconditions: () => <T extends FeathersBaseContext>(ctx: T) => Promise<T>;
|
|
92
105
|
/**
|
|
93
106
|
* Returns the transpiled and prettified JavaScript for a TypeScript source code
|
|
94
107
|
*
|
package/lib/commons.js
CHANGED
|
@@ -26,12 +26,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.injectSource = exports.renderSource = exports.prettify = exports.PRETTIERRC = exports.getJavaScript = exports.initializeBaseContext = exports.addVersions = exports.getDatabaseAdapter = void 0;
|
|
29
|
+
exports.injectSource = exports.renderSource = exports.prettify = exports.PRETTIERRC = exports.getJavaScript = exports.checkPreconditions = exports.initializeBaseContext = exports.addVersions = exports.getDatabaseAdapter = exports.version = void 0;
|
|
30
|
+
const fs_1 = __importDefault(require("fs"));
|
|
31
|
+
const path_1 = require("path");
|
|
30
32
|
const promises_1 = require("fs/promises");
|
|
31
33
|
const pinion_1 = require("@feathershq/pinion");
|
|
32
34
|
const ts = __importStar(require("typescript"));
|
|
33
35
|
const prettier_1 = __importDefault(require("prettier"));
|
|
34
|
-
const
|
|
36
|
+
const path_2 = __importDefault(require("path"));
|
|
37
|
+
exports.version = JSON.parse(fs_1.default.readFileSync((0, path_1.join)(__dirname, '..', 'package.json')).toString()).version;
|
|
35
38
|
/**
|
|
36
39
|
* Returns the name of the Feathers database adapter for a supported database type
|
|
37
40
|
*
|
|
@@ -57,10 +60,11 @@ exports.addVersions = addVersions;
|
|
|
57
60
|
*/
|
|
58
61
|
const initializeBaseContext = () => (ctx) => Promise.resolve(ctx)
|
|
59
62
|
.then((0, pinion_1.loadJSON)((0, pinion_1.fromFile)('package.json'), (pkg) => ({ pkg }), {}))
|
|
60
|
-
.then((0, pinion_1.loadJSON)(
|
|
63
|
+
.then((0, pinion_1.loadJSON)(path_2.default.join(__dirname, '..', 'package.json'), (pkg) => ({
|
|
61
64
|
dependencyVersions: {
|
|
62
65
|
...pkg.devDependencies,
|
|
63
|
-
...ctx.dependencyVersions
|
|
66
|
+
...ctx.dependencyVersions,
|
|
67
|
+
'@feathersjs/cli': exports.version
|
|
64
68
|
}
|
|
65
69
|
})))
|
|
66
70
|
.then((ctx) => {
|
|
@@ -74,6 +78,22 @@ const initializeBaseContext = () => (ctx) => Promise.resolve(ctx)
|
|
|
74
78
|
});
|
|
75
79
|
});
|
|
76
80
|
exports.initializeBaseContext = initializeBaseContext;
|
|
81
|
+
/**
|
|
82
|
+
* Checks if the current context contains a valid generated application. This is necesary for most
|
|
83
|
+
* generators (besides the app generator).
|
|
84
|
+
*
|
|
85
|
+
* @param ctx The context to check against
|
|
86
|
+
* @returns Throws an error or returns the original context
|
|
87
|
+
*/
|
|
88
|
+
const checkPreconditions = () => async (ctx) => {
|
|
89
|
+
if (!ctx.feathers) {
|
|
90
|
+
throw new Error(`Can not run generator since the current folder does not appear to be a Feathers application.
|
|
91
|
+
Either your package.json is missing or it does not have \`feathers\` property.
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
return ctx;
|
|
95
|
+
};
|
|
96
|
+
exports.checkPreconditions = checkPreconditions;
|
|
77
97
|
const importRegex = /from '(\..*)'/g;
|
|
78
98
|
const escapeNewLines = (code) => code.replace(/\n\n/g, '\n/* :newline: */');
|
|
79
99
|
const restoreNewLines = (code) => code.replace(/\/\* :newline: \*\//g, '\n');
|
package/lib/commons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commons.js","sourceRoot":"","sources":["../src/commons.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"commons.js","sourceRoot":"","sources":["../src/commons.ts"],"names":[],"mappings":"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"}
|
package/lib/commons.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import { join } from 'path'
|
|
1
3
|
import { PackageJson } from 'type-fest'
|
|
2
4
|
import { readFile, writeFile } from 'fs/promises'
|
|
3
5
|
import {
|
|
@@ -14,6 +16,8 @@ import * as ts from 'typescript'
|
|
|
14
16
|
import prettier, { Options as PrettierOptions } from 'prettier'
|
|
15
17
|
import path from 'path'
|
|
16
18
|
|
|
19
|
+
export const { version } = JSON.parse(fs.readFileSync(join(__dirname, '..', 'package.json')).toString())
|
|
20
|
+
|
|
17
21
|
export type DependencyVersions = { [key: string]: string }
|
|
18
22
|
|
|
19
23
|
/**
|
|
@@ -50,6 +54,10 @@ export type FeathersAppInfo = {
|
|
|
50
54
|
* The HTTP framework used
|
|
51
55
|
*/
|
|
52
56
|
framework: 'koa' | 'express'
|
|
57
|
+
/**
|
|
58
|
+
* The main schema definition format
|
|
59
|
+
*/
|
|
60
|
+
schema: 'typebox' | 'json'
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
export interface AppPackageJson extends PackageJson {
|
|
@@ -110,7 +118,8 @@ export const initializeBaseContext =
|
|
|
110
118
|
loadJSON(path.join(__dirname, '..', 'package.json'), (pkg: PackageJson) => ({
|
|
111
119
|
dependencyVersions: {
|
|
112
120
|
...pkg.devDependencies,
|
|
113
|
-
...ctx.dependencyVersions
|
|
121
|
+
...ctx.dependencyVersions,
|
|
122
|
+
'@feathersjs/cli': version
|
|
114
123
|
}
|
|
115
124
|
}))
|
|
116
125
|
)
|
|
@@ -122,6 +131,25 @@ export const initializeBaseContext =
|
|
|
122
131
|
feathers: ctx.pkg?.feathers
|
|
123
132
|
}))
|
|
124
133
|
|
|
134
|
+
/**
|
|
135
|
+
* Checks if the current context contains a valid generated application. This is necesary for most
|
|
136
|
+
* generators (besides the app generator).
|
|
137
|
+
*
|
|
138
|
+
* @param ctx The context to check against
|
|
139
|
+
* @returns Throws an error or returns the original context
|
|
140
|
+
*/
|
|
141
|
+
export const checkPreconditions =
|
|
142
|
+
() =>
|
|
143
|
+
async <T extends FeathersBaseContext>(ctx: T) => {
|
|
144
|
+
if (!ctx.feathers) {
|
|
145
|
+
throw new Error(`Can not run generator since the current folder does not appear to be a Feathers application.
|
|
146
|
+
Either your package.json is missing or it does not have \`feathers\` property.
|
|
147
|
+
`)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return ctx
|
|
151
|
+
}
|
|
152
|
+
|
|
125
153
|
const importRegex = /from '(\..*)'/g
|
|
126
154
|
const escapeNewLines = (code: string) => code.replace(/\n\n/g, '\n/* :newline: */')
|
|
127
155
|
const restoreNewLines = (code: string) => code.replace(/\/\* :newline: \*\//g, '\n')
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { FeathersBaseContext, DatabaseType } from '../commons';
|
|
2
2
|
export interface ConnectionGeneratorContext extends FeathersBaseContext {
|
|
3
|
+
name?: string;
|
|
3
4
|
database: DatabaseType;
|
|
4
5
|
connectionString: string;
|
|
5
6
|
dependencies: string[];
|
|
6
7
|
}
|
|
7
|
-
export declare type ConnectionGeneratorArguments = FeathersBaseContext & Partial<Pick<ConnectionGeneratorContext, 'database' | 'connectionString'>>;
|
|
8
|
+
export declare type ConnectionGeneratorArguments = FeathersBaseContext & Partial<Pick<ConnectionGeneratorContext, 'database' | 'connectionString' | 'name'>>;
|
|
8
9
|
export declare const defaultConnectionString: (type: DatabaseType, name: string) => string;
|
|
9
|
-
export declare const prompts: ({ database, connectionString, pkg }: ConnectionGeneratorArguments) => ({
|
|
10
|
+
export declare const prompts: ({ database, connectionString, pkg, name }: ConnectionGeneratorArguments) => ({
|
|
10
11
|
name: string;
|
|
11
12
|
type: string;
|
|
12
13
|
when: boolean;
|
|
@@ -39,13 +40,14 @@ export declare const DATABASE_CLIENTS: {
|
|
|
39
40
|
export declare const getDatabaseClient: (database: DatabaseType) => string;
|
|
40
41
|
export declare const generate: (ctx: ConnectionGeneratorArguments) => Promise<{
|
|
41
42
|
dependencies: string[];
|
|
43
|
+
name?: string;
|
|
42
44
|
database: DatabaseType;
|
|
43
45
|
connectionString: string;
|
|
44
46
|
feathers: import("../commons").FeathersAppInfo;
|
|
45
47
|
pkg: import("../commons").AppPackageJson;
|
|
46
48
|
lib: string;
|
|
47
49
|
test: string;
|
|
48
|
-
language: "
|
|
50
|
+
language: "ts" | "js";
|
|
49
51
|
dependencyVersions?: import("../commons").DependencyVersions;
|
|
50
52
|
cwd: string;
|
|
51
53
|
_?: (string | number)[];
|
package/lib/connection/index.js
CHANGED
|
@@ -18,7 +18,7 @@ const defaultConnectionString = (type, name) => {
|
|
|
18
18
|
return connectionStrings[type];
|
|
19
19
|
};
|
|
20
20
|
exports.defaultConnectionString = defaultConnectionString;
|
|
21
|
-
const prompts = ({ database, connectionString, pkg }) => [
|
|
21
|
+
const prompts = ({ database, connectionString, pkg, name }) => [
|
|
22
22
|
{
|
|
23
23
|
name: 'database',
|
|
24
24
|
type: 'list',
|
|
@@ -38,7 +38,7 @@ const prompts = ({ database, connectionString, pkg }) => [
|
|
|
38
38
|
type: 'input',
|
|
39
39
|
when: !connectionString,
|
|
40
40
|
message: 'Enter your database connection string',
|
|
41
|
-
default: (answers) => (0, exports.defaultConnectionString)(answers.database, answers.name || pkg.name)
|
|
41
|
+
default: (answers) => (0, exports.defaultConnectionString)(answers.database, answers.name || name || pkg.name)
|
|
42
42
|
}
|
|
43
43
|
];
|
|
44
44
|
exports.prompts = prompts;
|
|
@@ -52,6 +52,8 @@ exports.DATABASE_CLIENTS = {
|
|
|
52
52
|
const getDatabaseClient = (database) => exports.DATABASE_CLIENTS[database];
|
|
53
53
|
exports.getDatabaseClient = getDatabaseClient;
|
|
54
54
|
const generate = (ctx) => (0, pinion_1.generator)(ctx)
|
|
55
|
+
.then((0, commons_1.initializeBaseContext)())
|
|
56
|
+
.then((0, commons_1.checkPreconditions)())
|
|
55
57
|
.then((0, pinion_1.prompt)(exports.prompts))
|
|
56
58
|
.then((0, pinion_1.runGenerator)(__dirname, 'templates', ({ database }) => `${(0, commons_1.getDatabaseAdapter)(database)}.tpl`))
|
|
57
59
|
.then((0, pinion_1.mergeJSON)(({ connectionString, database }) => (0, commons_1.getDatabaseAdapter)(database) === 'knex'
|
|
@@ -80,7 +82,7 @@ const generate = (ctx) => (0, pinion_1.generator)(ctx)
|
|
|
80
82
|
dependencies: [...ctx.dependencies, ...dependencies]
|
|
81
83
|
};
|
|
82
84
|
}
|
|
83
|
-
return (0, pinion_1.install)((0, commons_1.addVersions)(dependencies, ctx.dependencyVersions))(ctx);
|
|
85
|
+
return (0, pinion_1.install)((0, commons_1.addVersions)(dependencies, ctx.dependencyVersions), false, ctx.feathers.packager)(ctx);
|
|
84
86
|
});
|
|
85
87
|
exports.generate = generate;
|
|
86
88
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connection/index.ts"],"names":[],"mappings":";;;;;;AAAA,+CAAgG;AAChG,kDAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connection/index.ts"],"names":[],"mappings":"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"}
|