fix: path not available in browser
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
import path from "path";
|
|
||||||
import invariant from "invariant";
|
import invariant from "invariant";
|
||||||
import { find, orderBy, filter, compact, omitBy } from "lodash";
|
import { find, orderBy, filter, compact, omitBy } from "lodash";
|
||||||
import { observable, action, computed, runInAction } from "mobx";
|
import { observable, action, computed, runInAction } from "mobx";
|
||||||
@@ -14,6 +13,7 @@ import Team from "~/models/Team";
|
|||||||
import env from "~/env";
|
import env from "~/env";
|
||||||
import { FetchOptions, PaginationParams, SearchResult } from "~/types";
|
import { FetchOptions, PaginationParams, SearchResult } from "~/types";
|
||||||
import { client } from "~/utils/ApiClient";
|
import { client } from "~/utils/ApiClient";
|
||||||
|
import { extname } from "~/utils/files";
|
||||||
|
|
||||||
type FetchPageParams = PaginationParams & {
|
type FetchPageParams = PaginationParams & {
|
||||||
template?: boolean;
|
template?: boolean;
|
||||||
@@ -603,7 +603,7 @@ export default class DocumentsStore extends BaseStore<Document> {
|
|||||||
if (
|
if (
|
||||||
file.type &&
|
file.type &&
|
||||||
!this.importFileTypes.includes(file.type) &&
|
!this.importFileTypes.includes(file.type) &&
|
||||||
!this.importFileTypes.includes(path.extname(file.name))
|
!this.importFileTypes.includes(extname(file.name))
|
||||||
) {
|
) {
|
||||||
throw new Error(`The selected file type is not supported (${file.type})`);
|
throw new Error(`The selected file type is not supported (${file.type})`);
|
||||||
}
|
}
|
||||||
|
|||||||
12
app/utils/files.test.ts
Normal file
12
app/utils/files.test.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { extname } from "./files";
|
||||||
|
|
||||||
|
describe("#extname", () => {
|
||||||
|
test("should extract file extension from string", () => {
|
||||||
|
expect(extname("one.doc")).toBe(".doc");
|
||||||
|
expect(extname("one.test.ts")).toBe(".ts");
|
||||||
|
expect(extname(".DS_Store")).toBe("");
|
||||||
|
expect(extname("directory/one.pdf")).toBe(".pdf");
|
||||||
|
expect(extname("../relative/one.doc")).toBe(".doc");
|
||||||
|
expect(extname(".hidden/directory/one.txt")).toBe(".txt");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -87,3 +87,66 @@ export const dataUrlToBlob = (dataURL: string) => {
|
|||||||
});
|
});
|
||||||
return file;
|
return file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const CHAR_FORWARD_SLASH = 47; /* / */
|
||||||
|
const CHAR_DOT = 46; /* . */
|
||||||
|
|
||||||
|
// Based on the NodeJS Library https://github.com/nodejs/node/blob/896b75a4da58a7283d551c4595e0aa454baca3e0/lib/path.js
|
||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
export const extname = (path: string) => {
|
||||||
|
if (typeof path !== "string") {
|
||||||
|
throw new TypeError(
|
||||||
|
`The "path" argument must be of type string. Received type ${typeof path}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let startDot = -1;
|
||||||
|
let startPart = 0;
|
||||||
|
let end = -1;
|
||||||
|
let matchedSlash = true;
|
||||||
|
// Track the state of characters (if any) we see before our first dot and
|
||||||
|
// after any path separator we find
|
||||||
|
let preDotState = 0;
|
||||||
|
for (let i = path.length - 1; i >= 0; --i) {
|
||||||
|
const code = path.charCodeAt(i);
|
||||||
|
if (code === CHAR_FORWARD_SLASH) {
|
||||||
|
// If we reached a path separator that was not part of a set of path
|
||||||
|
// separators at the end of the string, stop now
|
||||||
|
if (!matchedSlash) {
|
||||||
|
startPart = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (end === -1) {
|
||||||
|
// We saw the first non-path separator, mark this as the end of our
|
||||||
|
// extension
|
||||||
|
matchedSlash = false;
|
||||||
|
end = i + 1;
|
||||||
|
}
|
||||||
|
if (code === CHAR_DOT) {
|
||||||
|
// If this is our first dot, mark it as the start of our extension
|
||||||
|
if (startDot === -1) {
|
||||||
|
startDot = i;
|
||||||
|
} else if (preDotState !== 1) {
|
||||||
|
preDotState = 1;
|
||||||
|
}
|
||||||
|
} else if (startDot !== -1) {
|
||||||
|
// We saw a non-dot and non-path separator before our dot, so we should
|
||||||
|
// have a good chance at having a non-empty extension
|
||||||
|
preDotState = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
startDot === -1 ||
|
||||||
|
end === -1 ||
|
||||||
|
// We saw a non-dot character immediately before the dot
|
||||||
|
preDotState === 0 ||
|
||||||
|
// The (right-most) trimmed path component is exactly '..'
|
||||||
|
(preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
|
||||||
|
) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return path.slice(startDot, end);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user