mirror of
https://github.com/sasjs/server.git
synced 2025-12-11 03:34:35 +00:00
fix(deploy): validating empty file or service in filetree
This commit is contained in:
@@ -92,7 +92,7 @@
|
|||||||
},
|
},
|
||||||
"nodemonConfig": {
|
"nodemonConfig": {
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"tmp/appStreamConfig.json"
|
"tmp/**/*"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,6 +161,8 @@ components:
|
|||||||
$ref: '#/components/schemas/FolderMember'
|
$ref: '#/components/schemas/FolderMember'
|
||||||
-
|
-
|
||||||
$ref: '#/components/schemas/ServiceMember'
|
$ref: '#/components/schemas/ServiceMember'
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/FileMember'
|
||||||
type: array
|
type: array
|
||||||
required:
|
required:
|
||||||
- name
|
- name
|
||||||
@@ -172,20 +174,30 @@ components:
|
|||||||
enum:
|
enum:
|
||||||
- service
|
- service
|
||||||
type: string
|
type: string
|
||||||
MemberType.file:
|
|
||||||
enum:
|
|
||||||
- file
|
|
||||||
type: string
|
|
||||||
ServiceMember:
|
ServiceMember:
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
type: string
|
type: string
|
||||||
type:
|
type:
|
||||||
anyOf:
|
$ref: '#/components/schemas/MemberType.service'
|
||||||
-
|
code:
|
||||||
$ref: '#/components/schemas/MemberType.service'
|
type: string
|
||||||
-
|
required:
|
||||||
$ref: '#/components/schemas/MemberType.file'
|
- name
|
||||||
|
- type
|
||||||
|
- code
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
MemberType.file:
|
||||||
|
enum:
|
||||||
|
- file
|
||||||
|
type: string
|
||||||
|
FileMember:
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
$ref: '#/components/schemas/MemberType.file'
|
||||||
code:
|
code:
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
@@ -203,6 +215,8 @@ components:
|
|||||||
$ref: '#/components/schemas/FolderMember'
|
$ref: '#/components/schemas/FolderMember'
|
||||||
-
|
-
|
||||||
$ref: '#/components/schemas/ServiceMember'
|
$ref: '#/components/schemas/ServiceMember'
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/FileMember'
|
||||||
type: array
|
type: array
|
||||||
required:
|
required:
|
||||||
- members
|
- members
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
import { MemberType, FolderMember, ServiceMember, FileTree } from '../../types'
|
import {
|
||||||
|
MemberType,
|
||||||
|
FolderMember,
|
||||||
|
ServiceMember,
|
||||||
|
FileTree,
|
||||||
|
FileMember
|
||||||
|
} from '../../types'
|
||||||
import { getTmpFilesFolderPath } from '../../utils/file'
|
import { getTmpFilesFolderPath } from '../../utils/file'
|
||||||
import { createFolder, createFile, asyncForEach } from '@sasjs/utils'
|
import { createFolder, createFile, asyncForEach } from '@sasjs/utils'
|
||||||
|
|
||||||
// REFACTOR: export FileTreeCpntroller
|
// REFACTOR: export FileTreeCpntroller
|
||||||
export const createFileTree = async (
|
export const createFileTree = async (
|
||||||
members: (FolderMember | ServiceMember)[],
|
members: (FolderMember | ServiceMember | FileMember)[],
|
||||||
parentFolders: string[] = []
|
parentFolders: string[] = []
|
||||||
) => {
|
) => {
|
||||||
const destinationPath = path.join(
|
const destinationPath = path.join(
|
||||||
@@ -13,29 +19,32 @@ export const createFileTree = async (
|
|||||||
path.join(...parentFolders)
|
path.join(...parentFolders)
|
||||||
)
|
)
|
||||||
|
|
||||||
await asyncForEach(members, async (member: FolderMember | ServiceMember) => {
|
await asyncForEach(
|
||||||
let name = member.name
|
members,
|
||||||
|
async (member: FolderMember | ServiceMember | FileMember) => {
|
||||||
|
let name = member.name
|
||||||
|
|
||||||
if (member.type === MemberType.service) name += '.sas'
|
if (member.type === MemberType.service) name += '.sas'
|
||||||
|
|
||||||
if (member.type === MemberType.folder) {
|
if (member.type === MemberType.folder) {
|
||||||
await createFolder(path.join(destinationPath, name)).catch((err) =>
|
await createFolder(path.join(destinationPath, name)).catch((err) =>
|
||||||
Promise.reject({ error: err, failedToCreate: name })
|
Promise.reject({ error: err, failedToCreate: name })
|
||||||
)
|
)
|
||||||
|
|
||||||
await createFileTree(member.members, [...parentFolders, name]).catch(
|
await createFileTree(member.members, [...parentFolders, name]).catch(
|
||||||
(err) => Promise.reject({ error: err, failedToCreate: name })
|
(err) => Promise.reject({ error: err, failedToCreate: name })
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
const encoding = member.type === MemberType.file ? 'base64' : undefined
|
const encoding = member.type === MemberType.file ? 'base64' : undefined
|
||||||
|
|
||||||
await createFile(
|
await createFile(
|
||||||
path.join(destinationPath, name),
|
path.join(destinationPath, name),
|
||||||
member.code,
|
member.code,
|
||||||
encoding
|
encoding
|
||||||
).catch((err) => Promise.reject({ error: err, failedToCreate: name }))
|
).catch((err) => Promise.reject({ error: err, failedToCreate: name }))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
)
|
||||||
|
|
||||||
return Promise.resolve()
|
return Promise.resolve()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,28 @@
|
|||||||
export interface FileTree {
|
export enum MemberType {
|
||||||
members: (FolderMember | ServiceMember)[]
|
service = 'service',
|
||||||
|
file = 'file',
|
||||||
|
folder = 'folder'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum MemberType {
|
export interface ServiceMember {
|
||||||
folder = 'folder',
|
name: string
|
||||||
service = 'service',
|
type: MemberType.service
|
||||||
file = 'file'
|
code: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FileMember {
|
||||||
|
name: string
|
||||||
|
type: MemberType.file
|
||||||
|
code: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FolderMember {
|
export interface FolderMember {
|
||||||
name: string
|
name: string
|
||||||
type: MemberType.folder
|
type: MemberType.folder
|
||||||
members: (FolderMember | ServiceMember)[]
|
members: (FolderMember | ServiceMember | FileMember)[]
|
||||||
}
|
}
|
||||||
|
export interface FileTree {
|
||||||
export interface ServiceMember {
|
members: (FolderMember | ServiceMember | FileMember)[]
|
||||||
name: string
|
|
||||||
type: MemberType.service | MemberType.file
|
|
||||||
code: string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isFileTree = (arg: any): arg is FileTree =>
|
export const isFileTree = (arg: any): arg is FileTree =>
|
||||||
@@ -25,11 +30,25 @@ export const isFileTree = (arg: any): arg is FileTree =>
|
|||||||
arg.members &&
|
arg.members &&
|
||||||
Array.isArray(arg.members) &&
|
Array.isArray(arg.members) &&
|
||||||
arg.members.filter(
|
arg.members.filter(
|
||||||
(member: FolderMember | ServiceMember) =>
|
(member: ServiceMember | FileMember | FolderMember) =>
|
||||||
!isFolderMember(member) && !isServiceMember(member)
|
!isServiceMember(member, '-') &&
|
||||||
|
!isFileMember(member, '-') &&
|
||||||
|
!isFolderMember(member, '-')
|
||||||
).length === 0
|
).length === 0
|
||||||
|
|
||||||
const isFolderMember = (arg: any): arg is FolderMember =>
|
const isServiceMember = (arg: any, pre: string): arg is ServiceMember =>
|
||||||
|
arg &&
|
||||||
|
typeof arg.name === 'string' &&
|
||||||
|
arg.type === MemberType.service &&
|
||||||
|
typeof arg.code === 'string'
|
||||||
|
|
||||||
|
const isFileMember = (arg: any, pre: string): arg is ServiceMember =>
|
||||||
|
arg &&
|
||||||
|
typeof arg.name === 'string' &&
|
||||||
|
arg.type === MemberType.file &&
|
||||||
|
typeof arg.code === 'string'
|
||||||
|
|
||||||
|
const isFolderMember = (arg: any, pre: string): arg is FolderMember =>
|
||||||
arg &&
|
arg &&
|
||||||
typeof arg.name === 'string' &&
|
typeof arg.name === 'string' &&
|
||||||
arg.type === MemberType.folder &&
|
arg.type === MemberType.folder &&
|
||||||
@@ -37,21 +56,7 @@ const isFolderMember = (arg: any): arg is FolderMember =>
|
|||||||
Array.isArray(arg.members) &&
|
Array.isArray(arg.members) &&
|
||||||
arg.members.filter(
|
arg.members.filter(
|
||||||
(member: FolderMember | ServiceMember) =>
|
(member: FolderMember | ServiceMember) =>
|
||||||
!isFolderMember(member) &&
|
!isServiceMember(member, pre + '-') &&
|
||||||
!isServiceMember(member) &&
|
!isFileMember(member, pre + '-') &&
|
||||||
!isFileMember(member)
|
!isFolderMember(member, pre + '-')
|
||||||
).length === 0
|
).length === 0
|
||||||
|
|
||||||
const isServiceMember = (arg: any): arg is ServiceMember =>
|
|
||||||
arg &&
|
|
||||||
typeof arg.name === 'string' &&
|
|
||||||
arg.type === MemberType.service &&
|
|
||||||
arg.code &&
|
|
||||||
typeof arg.code === 'string'
|
|
||||||
|
|
||||||
const isFileMember = (arg: any): arg is ServiceMember =>
|
|
||||||
arg &&
|
|
||||||
typeof arg.name === 'string' &&
|
|
||||||
arg.type === MemberType.file &&
|
|
||||||
arg.code &&
|
|
||||||
typeof arg.code === 'string'
|
|
||||||
|
|||||||
Reference in New Issue
Block a user