commit
f8f97912bf
@ -0,0 +1,33 @@ |
||||
/* polls sqlite database */ |
||||
/* create a table polls (id, descrip, published, updated) */ |
||||
/* create a table pollques (id, pollid, question) */ |
||||
/* create a table pollans (id, pollid, pollquesid, answer, totlvotes) */ |
||||
/* create a table pollresp (id, pollid, pollquesid, pollansid, datetime) */ |
||||
CREATE TABLE polls ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
descrip TEXT, |
||||
published INTEGER, |
||||
updated INTEGER |
||||
); |
||||
|
||||
CREATE TABLE pollques ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
question TEXT |
||||
); |
||||
|
||||
CREATE TABLE pollans ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
pollquesid INTEGER, |
||||
answer TEXT, |
||||
totlvotes INTEGER |
||||
); |
||||
|
||||
CREATE TABLE pollresp ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
pollquesid INTEGER, |
||||
pollansid INTEGER, |
||||
datetime INTEGER |
||||
); |
@ -0,0 +1,3 @@ |
||||
@tailwind base; |
||||
@tailwind components; |
||||
@tailwind utilities; |
@ -0,0 +1,219 @@ |
||||
<?php |
||||
// create an sqlite database qs36f.db |
||||
/* create a table polls (id, descrip, published, updated) */ |
||||
/* create a table pollques (id, pollid, question) */ |
||||
/* create a table pollans (id, pollid, pollquesid, answer, totlvotes) */ |
||||
/* create a table pollresp (id, pollid, pollquesid, pollansid, datetime) */ |
||||
|
||||
$db = new SQLite3('qs36f.db'); |
||||
|
||||
$creation_statements = " |
||||
CREATE TABLE polls ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
descrip TEXT, |
||||
published INTEGER, |
||||
updated INTEGER |
||||
); |
||||
|
||||
CREATE TABLE pollques ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
question TEXT |
||||
); |
||||
|
||||
CREATE TABLE pollans ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
pollquesid INTEGER, |
||||
answer TEXT, |
||||
totlvotes INTEGER |
||||
); |
||||
|
||||
CREATE TABLE pollresp ( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
pollid INTEGER, |
||||
pollquesid INTEGER, |
||||
pollansid INTEGER, |
||||
datetime INTEGER |
||||
)"; |
||||
|
||||
// $db->exec($creation_statements); // Only needs to run once. |
||||
|
||||
/** |
||||
* Database: |
||||
* // Each individual Poll themselves: |
||||
* - qs36f/polls (id, descrip, published, updated) |
||||
* // Each question in a given poll: |
||||
* - qs36f/pollques (id, pollid, question) |
||||
* // Answers to a given question in a given poll: |
||||
* - qs36f/pollans (id, pollid, pollqid, answer, totlvotes) |
||||
* // Each response to a given question in a given poll: |
||||
* - qs36f/pollresp (id, pollid, pollqid, pollansid, datetime) |
||||
*/ |
||||
|
||||
class DBConnector { |
||||
private $connector; |
||||
|
||||
public function __construct($connector) { |
||||
$this->connector = $connector; |
||||
} |
||||
|
||||
public function query($sql) { |
||||
return $this->connector->query($sql); |
||||
} |
||||
|
||||
public function fetchArray($result) { |
||||
return $result->fetchArray(SQLITE3_ASSOC); |
||||
} |
||||
|
||||
public function lastErrorCode() { |
||||
return $this->connector->lastErrorCode(); |
||||
} |
||||
|
||||
public function lastErrorMsg() { |
||||
return $this->connector->lastErrorMsg(); |
||||
} |
||||
|
||||
public function doError($function, $sql) { |
||||
echo "Error in $function: " . $this->lastErrorCode() |
||||
. " " . $this->lastErrorMsg() |
||||
. " " . $sql /* Comment this line to disable sql output to browser */ |
||||
; |
||||
$this->connector->close(); |
||||
} |
||||
} |
||||
|
||||
class Poll { |
||||
private string $id; |
||||
private string $descrip; |
||||
private int $published; |
||||
private int $updated; |
||||
private array $questions; |
||||
private DBConnector $db; |
||||
|
||||
public function __construct(string $id, DBConnector $db) { |
||||
$this->id = $id; |
||||
$this->db = $db; |
||||
$this->configureSelf(); |
||||
} |
||||
|
||||
private function configureSelf() { |
||||
$sql = "SELECT * FROM qs36f/polls p0 |
||||
where p0.id = " . $this->id; |
||||
|
||||
if (!$result = $this->db->query($sql)) { |
||||
doError(__FUNCTION__, $this->db->lastErrorCode(), $this->db->lastErrorMsg(), $sql); |
||||
} |
||||
# if (!$result = db2_exec($db2conn, $sql, array('CURSOR' => DB2_SCROLLABLE))) { |
||||
# doError(__FUNCTION__, db2_stmt_error(), db2_stmt_errormsg(), $sql); |
||||
# } |
||||
$row = $this->db->fetchArray($result); |
||||
|
||||
$this->descrip = $row['descrip']; |
||||
$this->published = $row['published']; |
||||
$this->updated = $row['updated']; |
||||
|
||||
$this->getQuestions(); |
||||
} |
||||
|
||||
private function getQuestions() { |
||||
$sql = "SELECT * FROM qs36f/pollques p0 |
||||
where p0.poll_id = " . $this->id; |
||||
|
||||
if (!$result = $this->db->query($sql)) { |
||||
doError(__FUNCTION__, $this->db->lastErrorCode(), $this->db->lastErrorMsg(), $sql); |
||||
} |
||||
$row = $this->db->fetchArray($result); |
||||
|
||||
$this->questions = array(); |
||||
while ($row = $this->db->fetchArray($result)) { |
||||
$this->questions[] = new PollQuestion($row['id'], $this->id, $row['question'], $this->db); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
class PollQuestion { |
||||
private $id; |
||||
private $pollid; |
||||
private $question; |
||||
private $answers; |
||||
private DBConnector $db; |
||||
|
||||
public function __construct($id, $pollid, $question, DBConnector $db) { |
||||
$this->db = $db; |
||||
$this->id = $id; |
||||
$this->pollid = $pollid; |
||||
$this->question = $question; |
||||
$this->configureSelf(); |
||||
} |
||||
|
||||
private function configureSelf() { |
||||
$sql = "SELECT * FROM qs36f/pollans p0 |
||||
where p0.pollid = " . $this->pollid . " |
||||
and p0.pollquesid = " . $this->id; |
||||
|
||||
if (!$result = $this->db->query($sql)) { |
||||
doError(__FUNCTION__, $this->db->lastErrorCode(), $this->db->lastErrorMsg(), $sql); |
||||
} |
||||
$row = $this->db->fetchArray($result); |
||||
|
||||
$this->answers = array(); |
||||
while ($row = $this->db->fetchArray($result)) { |
||||
$this->answers[] = new PollAnswer($row['id'], $this->pollid, $this->id, $row['answer'], $row['totlvotes']); |
||||
} |
||||
} |
||||
} |
||||
|
||||
class PollAnswer { |
||||
private $id; |
||||
private $pollid; |
||||
private $pollquesid; |
||||
private $answer; |
||||
private $totlvotes; |
||||
|
||||
public function __construct($id, $pollid, $pollquesid, $answer, $totlvotes) { |
||||
$this->id = $id; |
||||
$this->pollid = $pollid; |
||||
$this->pollquesid = $pollquesid; |
||||
$this->answer = $answer; |
||||
$this->totlvotes = $totlvotes; |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Ends program and notifies user. |
||||
* @param string $function - The function name that caused the error. |
||||
* @param string $error - The error that occurred. |
||||
* @param string $msg - The error message. |
||||
* @param string $misc_data - Any other data to be included in the output (sql). |
||||
*/ |
||||
function doError($function, $error, $msg, $misc_data = '') |
||||
{ |
||||
global $db2conn; |
||||
$misc_data = ''; // Comment this out to view sql on page. |
||||
die("<p><b>Error in $function: $error</b></p> |
||||
<p><b>$error</b></p> |
||||
<p><b>$msg</b></p> |
||||
<p><b>$misc_data</b></p> |
||||
"); |
||||
} |
||||
|
||||
$db_conn = new SQLite3('qs36f.db'); |
||||
$polls = array(); |
||||
$db = new DBConnector($db_conn); |
||||
$sql = "SELECT * FROM qs36f/polls p0"; |
||||
if (!$result = $db->query($sql)) { |
||||
doError(__FUNCTION__, $db->lastErrorCode(), $db->lastErrorMsg(), $sql); |
||||
} |
||||
$row = $db->fetchArray($result); |
||||
while ($row = $db->fetchArray($result)) { |
||||
$polls[] = new Poll($row['id'], $db); |
||||
} |
||||
|
||||
include ('poll_list.php'); |
||||
|
||||
foreach ($polls as $poll) { |
||||
include ('poll.php'); |
||||
} |
@ -0,0 +1 @@ |
||||
../acorn/bin/acorn |
@ -0,0 +1 @@ |
||||
../cssesc/bin/cssesc |
@ -0,0 +1 @@ |
||||
../detective/bin/detective.js |
@ -0,0 +1 @@ |
||||
../nanoid/bin/nanoid.cjs |
@ -0,0 +1 @@ |
||||
../resolve/bin/resolve |
@ -0,0 +1 @@ |
||||
../tailwindcss/lib/cli.js |
@ -0,0 +1 @@ |
||||
../tailwindcss/lib/cli.js |
@ -0,0 +1,796 @@ |
||||
{ |
||||
"name": "polls", |
||||
"lockfileVersion": 3, |
||||
"requires": true, |
||||
"packages": { |
||||
"node_modules/@nodelib/fs.scandir": { |
||||
"version": "2.1.5", |
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", |
||||
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"@nodelib/fs.stat": "2.0.5", |
||||
"run-parallel": "^1.1.9" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 8" |
||||
} |
||||
}, |
||||
"node_modules/@nodelib/fs.stat": { |
||||
"version": "2.0.5", |
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", |
||||
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 8" |
||||
} |
||||
}, |
||||
"node_modules/@nodelib/fs.walk": { |
||||
"version": "1.2.8", |
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", |
||||
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"@nodelib/fs.scandir": "2.1.5", |
||||
"fastq": "^1.6.0" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 8" |
||||
} |
||||
}, |
||||
"node_modules/acorn": { |
||||
"version": "7.4.1", |
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", |
||||
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", |
||||
"dev": true, |
||||
"bin": { |
||||
"acorn": "bin/acorn" |
||||
}, |
||||
"engines": { |
||||
"node": ">=0.4.0" |
||||
} |
||||
}, |
||||
"node_modules/acorn-node": { |
||||
"version": "1.8.2", |
||||
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", |
||||
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"acorn": "^7.0.0", |
||||
"acorn-walk": "^7.0.0", |
||||
"xtend": "^4.0.2" |
||||
} |
||||
}, |
||||
"node_modules/acorn-walk": { |
||||
"version": "7.2.0", |
||||
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", |
||||
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.4.0" |
||||
} |
||||
}, |
||||
"node_modules/anymatch": { |
||||
"version": "3.1.3", |
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", |
||||
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"normalize-path": "^3.0.0", |
||||
"picomatch": "^2.0.4" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 8" |
||||
} |
||||
}, |
||||
"node_modules/arg": { |
||||
"version": "5.0.2", |
||||
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", |
||||
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/binary-extensions": { |
||||
"version": "2.2.0", |
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", |
||||
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=8" |
||||
} |
||||
}, |
||||
"node_modules/braces": { |
||||
"version": "3.0.2", |
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", |
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"fill-range": "^7.0.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8" |
||||
} |
||||
}, |
||||
"node_modules/camelcase-css": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", |
||||
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 6" |
||||
} |
||||
}, |
||||
"node_modules/chokidar": { |
||||
"version": "3.5.3", |
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", |
||||
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", |
||||
"dev": true, |
||||
"funding": [ |
||||
{ |
||||
"type": "individual", |
||||
"url": "https://paulmillr.com/funding/" |
||||
} |
||||
], |
||||
"dependencies": { |
||||
"anymatch": "~3.1.2", |
||||
"braces": "~3.0.2", |
||||
"glob-parent": "~5.1.2", |
||||
"is-binary-path": "~2.1.0", |
||||
"is-glob": "~4.0.1", |
||||
"normalize-path": "~3.0.0", |
||||
"readdirp": "~3.6.0" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 8.10.0" |
||||
}, |
||||
"optionalDependencies": { |
||||
"fsevents": "~2.3.2" |
||||
} |
||||
}, |
||||
"node_modules/chokidar/node_modules/glob-parent": { |
||||
"version": "5.1.2", |
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", |
||||
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-glob": "^4.0.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 6" |
||||
} |
||||
}, |
||||
"node_modules/color-name": { |
||||
"version": "1.1.4", |
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", |
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/cssesc": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", |
||||
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", |
||||
"dev": true, |
||||
"bin": { |
||||
"cssesc": "bin/cssesc" |
||||
}, |
||||
"engines": { |
||||
"node": ">=4" |
||||
} |
||||
}, |
||||
"node_modules/defined": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", |
||||
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", |
||||
"dev": true, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/ljharb" |
||||
} |
||||
}, |
||||
"node_modules/detective": { |
||||
"version": "5.2.1", |
||||
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", |
||||
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"acorn-node": "^1.8.2", |
||||
"defined": "^1.0.0", |
||||
"minimist": "^1.2.6" |
||||
}, |
||||
"bin": { |
||||
"detective": "bin/detective.js" |
||||
}, |
||||
"engines": { |
||||
"node": ">=0.8.0" |
||||
} |
||||
}, |
||||
"node_modules/didyoumean": { |
||||
"version": "1.2.2", |
||||
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", |
||||
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/dlv": { |
||||
"version": "1.1.3", |
||||
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", |
||||
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/fast-glob": { |
||||
"version": "3.2.12", |
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", |
||||
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"@nodelib/fs.stat": "^2.0.2", |
||||
"@nodelib/fs.walk": "^1.2.3", |
||||
"glob-parent": "^5.1.2", |
||||
"merge2": "^1.3.0", |
||||
"micromatch": "^4.0.4" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.6.0" |
||||
} |
||||
}, |
||||
"node_modules/fast-glob/node_modules/glob-parent": { |
||||
"version": "5.1.2", |
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", |
||||
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-glob": "^4.0.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 6" |
||||
} |
||||
}, |
||||
"node_modules/fastq": { |
||||
"version": "1.15.0", |
||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", |
||||
"integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"reusify": "^1.0.4" |
||||
} |
||||
}, |
||||
"node_modules/fill-range": { |
||||
"version": "7.0.1", |
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", |
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"to-regex-range": "^5.0.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8" |
||||
} |
||||
}, |
||||
"node_modules/fsevents": { |
||||
"version": "2.3.2", |
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", |
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", |
||||
"dev": true, |
||||
"hasInstallScript": true, |
||||
"optional": true, |
||||
"os": [ |
||||
"darwin" |
||||
], |
||||
"engines": { |
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0" |
||||
} |
||||
}, |
||||
"node_modules/function-bind": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", |
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/glob-parent": { |
||||
"version": "6.0.2", |
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", |
||||
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-glob": "^4.0.3" |
||||
}, |
||||
"engines": { |
||||
"node": ">=10.13.0" |
||||
} |
||||
}, |
||||
"node_modules/has": { |
||||
"version": "1.0.3", |
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", |
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"function-bind": "^1.1.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 0.4.0" |
||||
} |
||||
}, |
||||
"node_modules/is-binary-path": { |
||||
"version": "2.1.0", |
||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", |
||||
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"binary-extensions": "^2.0.0" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8" |
||||
} |
||||
}, |
||||
"node_modules/is-core-module": { |
||||
"version": "2.11.0", |
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", |
||||
"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"has": "^1.0.3" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/ljharb" |
||||
} |
||||
}, |
||||
"node_modules/is-extglob": { |
||||
"version": "2.1.1", |
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/is-glob": { |
||||
"version": "4.0.3", |
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", |
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-extglob": "^2.1.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/is-number": { |
||||
"version": "7.0.0", |
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", |
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.12.0" |
||||
} |
||||
}, |
||||
"node_modules/lilconfig": { |
||||
"version": "2.0.6", |
||||
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", |
||||
"integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=10" |
||||
} |
||||
}, |
||||
"node_modules/merge2": { |
||||
"version": "1.4.1", |
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", |
||||
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 8" |
||||
} |
||||
}, |
||||
"node_modules/micromatch": { |
||||
"version": "4.0.5", |
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", |
||||
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"braces": "^3.0.2", |
||||
"picomatch": "^2.3.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.6" |
||||
} |
||||
}, |
||||
"node_modules/minimist": { |
||||
"version": "1.2.7", |
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", |
||||
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", |
||||
"dev": true, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/ljharb" |
||||
} |
||||
}, |
||||
"node_modules/nanoid": { |
||||
"version": "3.3.4", |
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", |
||||
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", |
||||
"dev": true, |
||||
"bin": { |
||||
"nanoid": "bin/nanoid.cjs" |
||||
}, |
||||
"engines": { |
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" |
||||
} |
||||
}, |
||||
"node_modules/normalize-path": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", |
||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/object-hash": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", |
||||
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 6" |
||||
} |
||||
}, |
||||
"node_modules/path-parse": { |
||||
"version": "1.0.7", |
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", |
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/picocolors": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", |
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/picomatch": { |
||||
"version": "2.3.1", |
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", |
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=8.6" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/jonschlinkert" |
||||
} |
||||
}, |
||||
"node_modules/pify": { |
||||
"version": "2.3.0", |
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", |
||||
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/postcss": { |
||||
"version": "8.4.21", |
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", |
||||
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", |
||||
"dev": true, |
||||
"funding": [ |
||||
{ |
||||
"type": "opencollective", |
||||
"url": "https://opencollective.com/postcss/" |
||||
}, |
||||
{ |
||||
"type": "tidelift", |
||||
"url": "https://tidelift.com/funding/github/npm/postcss" |
||||
} |
||||
], |
||||
"dependencies": { |
||||
"nanoid": "^3.3.4", |
||||
"picocolors": "^1.0.0", |
||||
"source-map-js": "^1.0.2" |
||||
}, |
||||
"engines": { |
||||
"node": "^10 || ^12 || >=14" |
||||
} |
||||
}, |
||||
"node_modules/postcss-import": { |
||||
"version": "14.1.0", |
||||
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", |
||||
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"postcss-value-parser": "^4.0.0", |
||||
"read-cache": "^1.0.0", |
||||
"resolve": "^1.1.7" |
||||
}, |
||||
"engines": { |
||||
"node": ">=10.0.0" |
||||
}, |
||||
"peerDependencies": { |
||||
"postcss": "^8.0.0" |
||||
} |
||||
}, |
||||
"node_modules/postcss-js": { |
||||
"version": "4.0.0", |
||||
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", |
||||
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"camelcase-css": "^2.0.1" |
||||
}, |
||||
"engines": { |
||||
"node": "^12 || ^14 || >= 16" |
||||
}, |
||||
"funding": { |
||||
"type": "opencollective", |
||||
"url": "https://opencollective.com/postcss/" |
||||
}, |
||||
"peerDependencies": { |
||||
"postcss": "^8.3.3" |
||||
} |
||||
}, |
||||
"node_modules/postcss-load-config": { |
||||
"version": "3.1.4", |
||||
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", |
||||
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"lilconfig": "^2.0.5", |
||||
"yaml": "^1.10.2" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 10" |
||||
}, |
||||
"funding": { |
||||
"type": "opencollective", |
||||
"url": "https://opencollective.com/postcss/" |
||||
}, |
||||
"peerDependencies": { |
||||
"postcss": ">=8.0.9", |
||||
"ts-node": ">=9.0.0" |
||||
}, |
||||
"peerDependenciesMeta": { |
||||
"postcss": { |
||||
"optional": true |
||||
}, |
||||
"ts-node": { |
||||
"optional": true |
||||
} |
||||
} |
||||
}, |
||||
"node_modules/postcss-nested": { |
||||
"version": "6.0.0", |
||||
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", |
||||
"integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"postcss-selector-parser": "^6.0.10" |
||||
}, |
||||
"engines": { |
||||
"node": ">=12.0" |
||||
}, |
||||
"funding": { |
||||
"type": "opencollective", |
||||
"url": "https://opencollective.com/postcss/" |
||||
}, |
||||
"peerDependencies": { |
||||
"postcss": "^8.2.14" |
||||
} |
||||
}, |
||||
"node_modules/postcss-selector-parser": { |
||||
"version": "6.0.11", |
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", |
||||
"integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"cssesc": "^3.0.0", |
||||
"util-deprecate": "^1.0.2" |
||||
}, |
||||
"engines": { |
||||
"node": ">=4" |
||||
} |
||||
}, |
||||
"node_modules/postcss-value-parser": { |
||||
"version": "4.2.0", |
||||
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", |
||||
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/queue-microtask": { |
||||
"version": "1.2.3", |
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", |
||||
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", |
||||
"dev": true, |
||||
"funding": [ |
||||
{ |
||||
"type": "github", |
||||
"url": "https://github.com/sponsors/feross" |
||||
}, |
||||
{ |
||||
"type": "patreon", |
||||
"url": "https://www.patreon.com/feross" |
||||
}, |
||||
{ |
||||
"type": "consulting", |
||||
"url": "https://feross.org/support" |
||||
} |
||||
] |
||||
}, |
||||
"node_modules/quick-lru": { |
||||
"version": "5.1.1", |
||||
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", |
||||
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=10" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/sindresorhus" |
||||
} |
||||
}, |
||||
"node_modules/read-cache": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", |
||||
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"pify": "^2.3.0" |
||||
} |
||||
}, |
||||
"node_modules/readdirp": { |
||||
"version": "3.6.0", |
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", |
||||
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"picomatch": "^2.2.1" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.10.0" |
||||
} |
||||
}, |
||||
"node_modules/resolve": { |
||||
"version": "1.22.1", |
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", |
||||
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-core-module": "^2.9.0", |
||||
"path-parse": "^1.0.7", |
||||
"supports-preserve-symlinks-flag": "^1.0.0" |
||||
}, |
||||
"bin": { |
||||
"resolve": "bin/resolve" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/ljharb" |
||||
} |
||||
}, |
||||
"node_modules/reusify": { |
||||
"version": "1.0.4", |
||||
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", |
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", |
||||
"dev": true, |
||||
"engines": { |
||||
"iojs": ">=1.0.0", |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/run-parallel": { |
||||
"version": "1.2.0", |
||||
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", |
||||
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", |
||||
"dev": true, |
||||
"funding": [ |
||||
{ |
||||
"type": "github", |
||||
"url": "https://github.com/sponsors/feross" |
||||
}, |
||||
{ |
||||
"type": "patreon", |
||||
"url": "https://www.patreon.com/feross" |
||||
}, |
||||
{ |
||||
"type": "consulting", |
||||
"url": "https://feross.org/support" |
||||
} |
||||
], |
||||
"dependencies": { |
||||
"queue-microtask": "^1.2.2" |
||||
} |
||||
}, |
||||
"node_modules/source-map-js": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", |
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.10.0" |
||||
} |
||||
}, |
||||
"node_modules/supports-preserve-symlinks-flag": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", |
||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 0.4" |
||||
}, |
||||
"funding": { |
||||
"url": "https://github.com/sponsors/ljharb" |
||||
} |
||||
}, |
||||
"node_modules/tailwindcss": { |
||||
"version": "3.2.4", |
||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", |
||||
"integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"arg": "^5.0.2", |
||||
"chokidar": "^3.5.3", |
||||
"color-name": "^1.1.4", |
||||
"detective": "^5.2.1", |
||||
"didyoumean": "^1.2.2", |
||||
"dlv": "^1.1.3", |
||||
"fast-glob": "^3.2.12", |
||||
"glob-parent": "^6.0.2", |
||||
"is-glob": "^4.0.3", |
||||
"lilconfig": "^2.0.6", |
||||
"micromatch": "^4.0.5", |
||||
"normalize-path": "^3.0.0", |
||||
"object-hash": "^3.0.0", |
||||
"picocolors": "^1.0.0", |
||||
"postcss": "^8.4.18", |
||||
"postcss-import": "^14.1.0", |
||||
"postcss-js": "^4.0.0", |
||||
"postcss-load-config": "^3.1.4", |
||||
"postcss-nested": "6.0.0", |
||||
"postcss-selector-parser": "^6.0.10", |
||||
"postcss-value-parser": "^4.2.0", |
||||
"quick-lru": "^5.1.1", |
||||
"resolve": "^1.22.1" |
||||
}, |
||||
"bin": { |
||||
"tailwind": "lib/cli.js", |
||||
"tailwindcss": "lib/cli.js" |
||||
}, |
||||
"engines": { |
||||
"node": ">=12.13.0" |
||||
}, |
||||
"peerDependencies": { |
||||
"postcss": "^8.0.9" |
||||
} |
||||
}, |
||||
"node_modules/to-regex-range": { |
||||
"version": "5.0.1", |
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", |
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", |
||||
"dev": true, |
||||
"dependencies": { |
||||
"is-number": "^7.0.0" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.0" |
||||
} |
||||
}, |
||||
"node_modules/util-deprecate": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", |
||||
"dev": true |
||||
}, |
||||
"node_modules/xtend": { |
||||
"version": "4.0.2", |
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", |
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">=0.4" |
||||
} |
||||
}, |
||||
"node_modules/yaml": { |
||||
"version": "1.10.2", |
||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", |
||||
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", |
||||
"dev": true, |
||||
"engines": { |
||||
"node": ">= 6" |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
The MIT License (MIT) |
||||
|
||||
Copyright (c) Denis Malinochkin |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
@ -0,0 +1,171 @@ |
||||
# @nodelib/fs.scandir |
||||
|
||||
> List files and directories inside the specified directory. |
||||
|
||||
## :bulb: Highlights |
||||
|
||||
The package is aimed at obtaining information about entries in the directory. |
||||
|
||||
* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). |
||||
* :gear: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type. See [`old` and `modern` mode](#old-and-modern-mode). |
||||
* :link: Can safely work with broken symbolic links. |
||||
|
||||
## Install |
||||
|
||||
```console |
||||
npm install @nodelib/fs.scandir |
||||
``` |
||||
|
||||
## Usage |
||||
|
||||
```ts |
||||
import * as fsScandir from '@nodelib/fs.scandir'; |
||||
|
||||
fsScandir.scandir('path', (error, stats) => { /* โฆ */ }); |
||||
``` |
||||
|
||||
## API |
||||
|
||||
### .scandir(path, [optionsOrSettings], callback) |
||||
|
||||
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path with standard callback-style. |
||||
|
||||
```ts |
||||
fsScandir.scandir('path', (error, entries) => { /* โฆ */ }); |
||||
fsScandir.scandir('path', {}, (error, entries) => { /* โฆ */ }); |
||||
fsScandir.scandir('path', new fsScandir.Settings(), (error, entries) => { /* โฆ */ }); |
||||
``` |
||||
|
||||
### .scandirSync(path, [optionsOrSettings]) |
||||
|
||||
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path. |
||||
|
||||
```ts |
||||
const entries = fsScandir.scandirSync('path'); |
||||
const entries = fsScandir.scandirSync('path', {}); |
||||
const entries = fsScandir.scandirSync(('path', new fsScandir.Settings()); |
||||
``` |
||||
|
||||
#### path |
||||
|
||||
* Required: `true` |
||||
* Type: `string | Buffer | URL` |
||||
|
||||
A path to a file. If a URL is provided, it must use the `file:` protocol. |
||||
|
||||
#### optionsOrSettings |
||||
|
||||
* Required: `false` |
||||
* Type: `Options | Settings` |
||||
* Default: An instance of `Settings` class |
||||
|
||||
An [`Options`](#options) object or an instance of [`Settings`](#settingsoptions) class. |
||||
|
||||
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. |
||||
|
||||
### Settings([options]) |
||||
|
||||
A class of full settings of the package. |
||||
|
||||
```ts |
||||
const settings = new fsScandir.Settings({ followSymbolicLinks: false }); |
||||
|
||||
const entries = fsScandir.scandirSync('path', settings); |
||||
``` |
||||
|
||||
## Entry |
||||
|
||||
* `name` โ The name of the entry (`unknown.txt`). |
||||
* `path` โ The path of the entry relative to call directory (`root/unknown.txt`). |
||||
* `dirent` โ An instance of [`fs.Dirent`](./src/types/index.ts) class. On Node.js below 10.10 will be emulated by [`DirentFromStats`](./src/utils/fs.ts) class. |
||||
* `stats` (optional) โ An instance of `fs.Stats` class. |
||||
|
||||
For example, the `scandir` call for `tools` directory with one directory inside: |
||||
|
||||
```ts |
||||
{ |
||||
dirent: Dirent { name: 'typedoc', /* โฆ */ }, |
||||
name: 'typedoc', |
||||
path: 'tools/typedoc' |
||||
} |
||||
``` |
||||
|
||||
## Options |
||||
|
||||
### stats |
||||
|
||||
* Type: `boolean` |
||||
* Default: `false` |
||||
|
||||
Adds an instance of `fs.Stats` class to the [`Entry`](#entry). |
||||
|
||||
> :book: Always use `fs.readdir` without the `withFileTypes` option. ??TODO?? |
||||
|
||||
### followSymbolicLinks |
||||
|
||||
* Type: `boolean` |
||||
* Default: `false` |
||||
|
||||
Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. |
||||
|
||||
### `throwErrorOnBrokenSymbolicLink` |
||||
|
||||
* Type: `boolean` |
||||
* Default: `true` |
||||
|
||||
Throw an error when symbolic link is broken if `true` or safely use `lstat` call if `false`. |
||||
|
||||
### `pathSegmentSeparator` |
||||
|
||||
* Type: `string` |
||||
* Default: `path.sep` |
||||
|
||||
By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. |
||||
|
||||
### `fs` |
||||
|
||||
* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) |
||||
* Default: A default FS methods |
||||
|
||||
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. |
||||
|
||||
```ts |
||||
interface FileSystemAdapter { |
||||
lstat?: typeof fs.lstat; |
||||
stat?: typeof fs.stat; |
||||
lstatSync?: typeof fs.lstatSync; |
||||
statSync?: typeof fs.statSync; |
||||
readdir?: typeof fs.readdir; |
||||
readdirSync?: typeof fs.readdirSync; |
||||
} |
||||
|
||||
const settings = new fsScandir.Settings({ |
||||
fs: { lstat: fakeLstat } |
||||
}); |
||||
``` |
||||
|
||||
## `old` and `modern` mode |
||||
|
||||
This package has two modes that are used depending on the environment and parameters of use. |
||||
|
||||
### old |
||||
|
||||
* Node.js below `10.10` or when the `stats` option is enabled |
||||
|
||||
When working in the old mode, the directory is read first (`fs.readdir`), then the type of entries is determined (`fs.lstat` and/or `fs.stat` for symbolic links). |
||||
|
||||
### modern |
||||
|
||||
* Node.js 10.10+ and the `stats` option is disabled |
||||
|
||||
In the modern mode, reading the directory (`fs.readdir` with the `withFileTypes` option) is combined with obtaining information about its entries. An additional call for symbolic links (`fs.stat`) is still present. |
||||
|
||||
This mode makes fewer calls to the file system. It's faster. |
||||
|
||||
## Changelog |
||||
|
||||
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. |
||||
|
||||
## License |
||||
|
||||
This software is released under the terms of the MIT license. |
@ -0,0 +1,20 @@ |
||||
import type * as fsStat from '@nodelib/fs.stat'; |
||||
import type { Dirent, ErrnoException } from '../types'; |
||||
export interface ReaddirAsynchronousMethod { |
||||
(filepath: string, options: { |
||||
withFileTypes: true; |
||||
}, callback: (error: ErrnoException | null, files: Dirent[]) => void): void; |
||||
(filepath: string, callback: (error: ErrnoException | null, files: string[]) => void): void; |
||||
} |
||||
export interface ReaddirSynchronousMethod { |
||||
(filepath: string, options: { |
||||
withFileTypes: true; |
||||
}): Dirent[]; |
||||
(filepath: string): string[]; |
||||
} |
||||
export declare type FileSystemAdapter = fsStat.FileSystemAdapter & { |
||||
readdir: ReaddirAsynchronousMethod; |
||||
readdirSync: ReaddirSynchronousMethod; |
||||
}; |
||||
export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter; |
||||
export declare function createFileSystemAdapter(fsMethods?: Partial<FileSystemAdapter>): FileSystemAdapter; |
@ -0,0 +1,19 @@ |
||||
"use strict"; |
||||
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0; |
||||
const fs = require("fs"); |
||||
exports.FILE_SYSTEM_ADAPTER = { |
||||
lstat: fs.lstat, |
||||
stat: fs.stat, |
||||
lstatSync: fs.lstatSync, |
||||
statSync: fs.statSync, |
||||
readdir: fs.readdir, |
||||
readdirSync: fs.readdirSync |
||||
}; |
||||
function createFileSystemAdapter(fsMethods) { |
||||
if (fsMethods === undefined) { |
||||
return exports.FILE_SYSTEM_ADAPTER; |
||||
} |
||||
return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); |
||||
} |
||||
exports.createFileSystemAdapter = createFileSystemAdapter; |
@ -0,0 +1,4 @@ |
||||
/** |
||||
* IS `true` for Node.js 10.10 and greater. |
||||
*/ |
||||
export declare const IS_SUPPORT_READDIR_WITH_FILE_TYPES: boolean; |
@ -0,0 +1,17 @@ |
||||
"use strict"; |
||||
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0; |
||||
const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); |
||||
if (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) { |
||||
throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`); |
||||
} |
||||
const MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); |
||||
const MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); |
||||
const SUPPORTED_MAJOR_VERSION = 10; |
||||
const SUPPORTED_MINOR_VERSION = 10; |
||||
const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; |
||||
const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; |
||||
/** |
||||
* IS `true` for Node.js 10.10 and greater. |
||||
*/ |
||||
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; |
@ -0,0 +1,12 @@ |
||||
import type { FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod } from './adapters/fs'; |
||||
import * as async from './providers/async'; |
||||
import Settings, { Options } from './settings'; |
||||
import type { Dirent, Entry } from './types'; |
||||
declare type AsyncCallback = async.AsyncCallback; |
||||
declare function scandir(path: string, callback: AsyncCallback): void; |
||||
declare function scandir(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; |
||||
declare namespace scandir { |
||||
function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise<Entry[]>; |
||||
} |
||||
declare function scandirSync(path: string, optionsOrSettings?: Options | Settings): Entry[]; |
||||
export { scandir, scandirSync, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod, Options }; |
@ -0,0 +1,26 @@ |
||||
"use strict"; |
||||
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
exports.Settings = exports.scandirSync = exports.scandir = void 0; |
||||
const async = require("./providers/async"); |
||||
const sync = require("./providers/sync"); |
||||
const settings_1 = require("./settings"); |
||||
exports.Settings = settings_1.default; |
||||
function scandir(path, optionsOrSettingsOrCallback, callback) { |
||||
if (typeof optionsOrSettingsOrCallback === 'function') { |
||||
async.read(path, getSettings(), optionsOrSettingsOrCallback); |
||||
return; |
||||
} |
||||
async.read(path, getSettings(optionsOrSettingsOrCallback), callback); |
||||
} |
||||
exports.scandir = scandir; |
||||
function scandirSync(path, optionsOrSettings) { |
||||
const settings = getSettings(optionsOrSettings); |
||||
return sync.read(path, settings); |
||||
} |
||||
exports.scandirSync = scandirSync; |
||||
function getSettings(settingsOrOptions = {}) { |
||||
if (settingsOrOptions instanceof settings_1.default) { |
||||
return settingsOrOptions; |
||||
} |
||||
return new settings_1.default(settingsOrOptions); |
||||
} |
@ -0,0 +1,7 @@ |
||||
/// <reference types="node" />
|
||||
import type Settings from '../settings'; |
||||
import type { Entry } from '../types'; |
||||
export declare type AsyncCallback = (error: NodeJS.ErrnoException, entries: Entry[]) => void; |
||||
export declare function read(directory: string, settings: Settings, callback: AsyncCallback): void; |
||||
export declare function readdirWithFileTypes(directory: string, settings: Settings, callback: AsyncCallback): void; |
||||
export declare function readdir(directory: string, settings: Settings, callback: AsyncCallback): void; |
@ -0,0 +1,104 @@ |
||||
"use strict"; |
||||
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
exports.readdir = exports.readdirWithFileTypes = exports.read = void 0; |
||||
const fsStat = require("@nodelib/fs.stat"); |
||||
const rpl = require("run-parallel"); |
||||
const constants_1 = require("../constants"); |
||||
const utils = require("../utils"); |
||||
const common = require("./common"); |
||||
function read(directory, settings, callback) { |
||||
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { |
||||
readdirWithFileTypes(directory, settings, callback); |